我们的代码有这样的内容:
@Resource(name = "java:comp/resource/foo/bar/ONE_QUEUE")
private Queue queue;
但是,在一个部署方案中,队列注释应如下所示:
@Resource(name = "java:comp/resource/foo/bar/SECOND_QUEUE")
private Queue queue;
我想选择与Maven构建配置文件一起使用的名称。
我有哪些选择?
答案 0 :(得分:10)
这不是正确的做事方式。应将资源添加到各个EJB的本地jndi名称中。这是为了将bean代码中使用的jndi名称与bean部署者设置的全局jndi绑定分开。可以通过ejb-jar.xml
和特定于appserver的部署描述符来处理bean 本地jndi绑定和全局绑定的映射。
因此,您应该声明您的@Resource
(相当于指示资源引用名称和类型的<resource-ref>
元素),如下所示:
@Resource(name = "jms/queue/aQueue")
private Queue queue;
然后,在特定于appserver的部署描述符中(对于GlassFish,它是sun-ejb-jar.xml
,对于JBoss,它是jboss.xml
,对于WebLogic,它是weblogic-ejb-jar.xml
等),声明<resource-ref>
element通过<jndi-name>
元素指示资源引用名称和全局jndi绑定。
<resource-ref>
<res-ref-name>jms/queue/aQueue</res-ref-name>
<jndi-name>resource/foo/bar/ONE_QUEUE</jndi-name>
</resource-ref>
一旦你完成了所有工作,就可以很容易地使用Maven对这个特定于appserver的部署描述符进行变形,以适应具有配置文件和过滤的不同环境。只需使用属性,激活资源过滤,并在配置文件中设置不同的值。这样的事情:
<resource-ref>
<res-ref-name>jms/queue/aQueue</res-ref-name>
<jndi-name>${my.jndi.name}</jndi-name>
</resource-ref>
答案 1 :(得分:1)
我认为你可以使用maven过滤,虽然它会感觉很奇怪。
Here是一篇关于这种方法的文章。
答案 2 :(得分:0)
如果您不想进行per-bean配置,可以使用JBoss Seam功能(参见Seam reference doc)。我不知道这是否是Java依赖注入规范(JSR-299)的一部分(如果您担心供应商独立性)。
编辑:显然它是JSR-299的一部分,请参阅resin's doc about JSR-299