我也遇到了同样的情况(虽然我有一个 ejb-jar.xml)。
在 WebSphere 上,我们被要求在部署时手动将 DataSource 绑定到正确的 JNDI 名称,因此为了使其正常工作,我像这样声明了 resource-ref:
[ ... ]
<session>
<ejb-name>MyEjb</ejb-name>
<resource-ref>
<description>DataSource</description>
<res-ref-name>java:comp/env/jdbc/myDatasource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
</resource-ref>
[ other stuff... ]
</session>
[ ... ]
在代码中,我会像这样进行查找:
(DataSource) InitialContext.doLookup("java:comp/env/jdbc/myDatasource");
现在,我的老板希望我这样做,以便可以在 WildFly 上部署相同的应用程序,其中 DataSource 的 JNDI 名称将始终为 java:/myDatasource,并且它必须在代码中不添加检查以使用另一个查找字符串的情况下工作(所以,与我在上面写的相同的行)。
几个小时后,我有了一个可行的解决方案。
我在 ejb 的 META-INF 文件夹中添加了一个 jboss-ejb3.xml 文件,我在其中覆盖了 resource-ref,如下所示:
[ ... ]
<session>
<ejb-name>MyEjb</ejb-name>
<resource-env-ref>
<description>DataSource</description>
<resource-env-ref-name>jdbc/myDatasource</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
<lookup-name>java:/myDatasource</lookup-name><!-- JNDI name of the DataSource -->
</resource-env-ref>
</session>
[ ... ]
由于 WebSphere 忽略了 jboss-ejb3.xml 文件,因此该应用程序可以部署在两个 Web 服务器上。
请注意我必须如何将节点定义为resource-env-ref。原因(据我所知)是在java:comp/env“节点”中找不到名称以“java:”开头的资源引用(不是资源环境引用)。因此,我不得不将 DataSource 的引用配置为资源环境引用。 lookup-name 节点将其映射到正确的 JNDI 名称。这样就可以通过使用相同的字符串"java:comp/env/jdbc/myDatasource" 进行查找来找到它。
Here's the documentation about the jboss-ejb3.xml file.
需要注意的一件事:在对 ejb-jar.xml 进行这些更改并添加 jboss-ejb3.xml 之后部署我的应用程序时,我遇到了可能是 WildFly 中的错误文件。以前版本的应用程序已经部署,当我替换它时,部署失败并出现以下错误:
java.lang.IllegalArgumentException: WFLYEE0047: Incompatible conflicting binding at java:jboss/exported/MyApp/my-ejb/MyEjb!com.example.MyEjbRemote source: org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor$2@65f33ac5
停止 WildFly,清除“tmp”文件夹并重新启动它允许我的应用程序部署。