[英]How to specify name for resource annotations in compile time?
我們的代碼有這樣的:
@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構建配置文件一起使用的名稱。
我有什么選擇?
這不是正確的做事方式。 應將資源添加到各個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>
元素通過<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>
我認為你可以使用maven過濾,雖然它會感覺很奇怪。
這是一篇關於這種方法的文章。
如果您不想進行per-bean配置,可以使用JBoss Seam功能(請參閱Seam參考文檔 )。 我不知道這是否是Java依賴注入規范(JSR-299)的一部分(如果您擔心供應商獨立性)。
編輯:顯然它是JSR-299的一部分,請參見樹脂關於JSR-299的文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.