2010-01-18 6 views
6

Notre code a quelque chose comme ceci:Comment spécifier le nom des annotations de ressources au moment de la compilation?

@Resource(name = "java:comp/resource/foo/bar/ONE_QUEUE") 
private Queue queue; 

Cependant, dans un scénario de déploiement de l'annotation de file d'attente devrait ressembler à ceci:

@Resource(name = "java:comp/resource/foo/bar/SECOND_QUEUE") 
private Queue queue; 

je voudrais choisir le nom à utiliser avec Maven créer des profils .

Quelles options ai-je?

Répondre

10

Ce n'est pas la bonne façon de faire les choses. Les ressources doivent être ajoutées au local jndi name des EJB individuels. Cela permet de séparer le nom jndi utilisé dans le code bean des bindings jndi globales définies par le déployeur de beans. Le mappage du bean local jndi binding et la liaison globale peuvent être gérés via les descripteurs de déploiement ejb-jar.xml et spécifiques au serveur d'applications.

Ainsi, au lieu, vous devez déclarer votre @Resource (ce qui équivaut à un nom de référence des ressources indiquant l'élément <resource-ref> et le type) comme ceci:

@Resource(name = "jms/queue/aQueue") 
private Queue queue; 

Puis, dans un descripteur de déploiement spécifique serveur d'applications (pour GlassFish c'est sun-ejb-jar.xml, pour JBoss c'est jboss.xml, pour WebLogic c'est weblogic-ejb-jar.xml, etc), déclarez un élément <resource-ref> indiquant le nom de référence de ressource et la liaison globale de jndi via l'élément <jndi-name>.

<resource-ref> 
    <res-ref-name>jms/queue/aQueue</res-ref-name> 
    <jndi-name>resource/foo/bar/ONE_QUEUE</jndi-name> 
</resource-ref> 

Une fois que vous aurez tout le travail chose, il sera facile de variabalize ce descripteur de déploiement spécifique à l'aide du serveur d'applications Maven pour différents environnements avec des profils et de filtrage. Utilisez simplement une propriété, activez le filtrage des ressources et définissez une valeur différente dans les profils. Quelque chose comme ça:

<resource-ref> 
    <res-ref-name>jms/queue/aQueue</res-ref-name> 
    <jndi-name>${my.jndi.name}</jndi-name> 
</resource-ref> 
+1

maintenant qui se sent mieux :) – Bozho

1

Je pense que vous pouvez utiliser le filtrage maven, bien que cela puisse paraître étrange.

Here est un article sur cette approche.

+0

C'est une idée intéressante, merci pour la pointe – tputkonen

0

Si vous ne voulez pas faire par haricots config, vous pouvez utiliser la fonctionnalité JBoss Seam pour cela (voir Seam reference doc). Je ne sais pas si cela fait partie de la spécification Java Dependency Injection (JSR-299) (si vous vous inquiétez de l'indépendance du fournisseur).

EDIT: Apparemment, il fait partie de la JSR-299, voir resin's doc about JSR-299

Questions connexes