L’utilisation de Apache CXF/JAX-RS pour la création de services REST passe par l’ajout d’annotations dans vos POJOs ce qui peut être contraignant quand ceux-ci sont générés depuis vos fichiers hbm via hbm2java. Heureusement il existe une solution à ce problème via l’utilisation de freemarker. Freemarker est une librairie de génération de template utilisée par hbm2java pour transformer les xml de mapping (.hbm) en POJOs java. Prenons par exemple l’annotation @XmlRootElement qui doit précéder tous les pojos que jax-rs va transformer en XML :
Dans votre target ANT hbm2java ajouter templatepath=“resources/META-INF/pojo_templates/“ avec pojo_templates le répertoire qui contiendra les templates freemarker modifiées.
Dans resources/META-INF/pojo_templates/ créer un fichier ‘PojoTypeDeclaration.ftl’ avec le contenu suivant :
<#if pojo.hasMetaAttribute("xmlrootelement")>
import javax.xml.bind.annotation.XmlRootElement;
</#if>
/**
${pojo.getClassJavaDoc(pojo.getDeclarationName() + " generated by hbm2java", 0)}
*/
<#include "Ejb3TypeDeclaration.ftl"/>
<#if pojo.hasMetaAttribute("xmlrootelement")>
@XmlRootElement(name="${pojo.getMetaAsString("xmlrootelement")}")
</#if>
${pojo.getClassModifiers()} ${pojo.getDeclarationType()} ${pojo.getDeclarationName()} ${pojo.getExtendsDeclaration()} ${pojo.getImplementsDeclaration()}
Il suffit alors d’ajouter dans votre fichier .hbm un meta attribute indiquant le nom du POJO. Exemple :
<hibernate-mapping package=“com.pojos”>
<class name=“MaClass” table=“ma”_table>
<meta attribute="xmlrootelement">MaClass</meta>
...
Le POJO généré sera alors de la forme :
import javax.xml.bind.annotation.XmlRootElement;
/**
* MaClass generated by hbm2java
*/
@XmlRootElement(name=“MaClass”)
public class MaClass implements java.io.Serializable { ... }
On peut biensur appliquer ce principe à d’autres annotations (XmlSeeAlso …) et à d’autres frameworks.

Commentaires