This is not the right way to do things. Resources should be added to the local jndi name of individual EJBs. This is to separate the jndi name used in the bean code from the global jndi bindings set by the bean deployer. The mapping of the bean local jndi binding and the global binding may be handled via the ejb-jar.xml
and appserver-specific deployment descriptors.
So, instead, you should declare your @Resource
(which is equivalent to a <resource-ref>
element indicating resource reference name and type) like this:
@Resource(name = "jms/queue/aQueue")
private Queue queue;
Then, in a appserver-specific deployment descriptor (for GlassFish it's sun-ejb-jar.xml
, for JBoss it's jboss.xml
, for WebLogic it's weblogic-ejb-jar.xml
, etc), declare a <resource-ref>
element indicating the resource reference name and the global jndi binding via the <jndi-name>
element.
<resource-ref>
<res-ref-name>jms/queue/aQueue</res-ref-name>
<jndi-name>resource/foo/bar/ONE_QUEUE</jndi-name>
</resource-ref>
Once you'll get the whole thing working, it will be easy to variabalize this appserver-specific deployment descriptor using Maven for different environments with profiles and filtering. Just use a property, activate filtering of resources, and set different value in profiles. Something like that:
<resource-ref>
<res-ref-name>jms/queue/aQueue</res-ref-name>
<jndi-name>${my.jndi.name}</jndi-name>
</resource-ref>