目前,我正在处理必须使用连接工厂的应用程序。 当我在WAS中设置的名称直接在全局级别查找连接工厂时,一切正常,但是为了解耦,我想在我的应用程序中定义资源引用并查找该名称。所以我在application.xml中创建了以下条目:
<resource-ref>
<res-ref-name>jms/connectionFactory</res-ref-name>
<res-type>javax.jms.ConnectionFactory</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
然后我在EJB中做的是进行以下查找:
ConnectionFactory connectionFactory =
(ConnectionFactory) ic.lookup("java:comp/env/jms/connectionFactory");
这导致了这个例外:
javax.naming.NameNotFoundException: Name comp/env/jms not found in context "java:".
我也尝试过:
ConnectionFactory connectionFactory =
(ConnectionFactory) ic.lookup("java:app/jms/connectionFactory");
导致:
javax.naming.NameNotFoundException: Context: BPMDev/applications/com.ibm.ws.AppNameSpaces/MAN_POT/root,
name: jms/connectionFactory: First component in name jms/connectionFactory not found.
有谁知道我在这里做错了什么? 提前谢谢!
答案 0 :(得分:1)
进一步调查让我: Lookup jndi resources WebSphere 8.5, Spring 3.1.3, Hibernate 4.1.10 EJB 3
答案包含在内:
application.xml中的条目和查找都必须以java:app / env开头。对于我的情况,这是:
<resource-ref>
<res-ref-name>java:app/env/jms/connectionFactory</res-ref-name>
<res-type>javax.jms.ConnectionFactory</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
和
ConnectionFactory connectionFactory =
(ConnectionFactory) ic.lookup("java:app/env/jms/connectionFactory");
答案 1 :(得分:0)
java:comp资源引用的作用域是组件,因此需要为您尝试查找它的同一组件定义资源引用。请注意,java:app的范围限定为整个应用程序,因此如果您切换到java:app并且工作正常,则java:comp可能不起作用,因为资源引用是针对错误的组件定义的。