无法在 Websphere 中的组件级别查找资源

Unable to lookup resource on component level in Websphere

目前我正在开发一个必须使用连接工厂的应用程序。 当我通过 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.

有谁知道我在这里做错了什么? 提前致谢!

进一步调查使我发现: 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");

java:comp 资源引用的范围仅限于组件,因此需要为您尝试查找的同一组件定义资源引用。请注意,java:app 作用于整个应用程序,因此如果您切换到 java:app 并且有效,则可能 java:comp 无效,因为为错误的组件定义了资源引用.