【问题标题】:Which JNDI datasource name works both on Wildfly and Websphere?哪个 JNDI 数据源名称适用于 Wildfly 和 Websphere?
【发布时间】:2017-05-03 08:02:49
【问题描述】:

我有一个需要在 Wildfly 和 Websphere 上部署为 war 文件的 java/spring web 应用程序

应用正在使用具有 JNDI 名称的数据源:

WebConfig.java 包含:

公共数据源数据源(){ 最终 JndiDataSourceLookup dsLookup = new JndiDataSourceLookup(); dsLookup.setResourceRef(true); 数据源 dataSource = dsLookup.getDataSource("jdbc/myDS"); 返回数据源; }

...并在 JNDI 数据源名称为 jdbc/myDS 的 Websphere 上完美运行。

Wildfly JNDI 名称必须以“java:/”或“java:jboss/”开头

更改 WebConfig.java 即可:

DataSource dataSource = dsLookup.getDataSource("java:/myDS");

哪个 JNDI 数据源名称在 Wildfly 和 Websphere 上都可以使用(可能还可以在其他应用服务器上使用?)

【问题讨论】:

    标签: websphere datasource jndi wildfly-10


    【解决方案1】:

    如果您使用资源引用进行查找,它们将与 Liberty 和 Wildfly 中的 java:comp/env 相关。

    有两种方法可以定义数据源。一种是使用 javax.annotation.Resource 注释。这可以用于类型、方法或字段定义。

    您也可以在 web.xml 或 ejb-jar.xml 中使用 resource-ref 元素:

    <resource-ref>
        <description />
    
        <res-ref-name>myRef</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
    

    如果您在应用程序代码中提供用户 ID/密码,则 res-auth 元素应包含 Application

    【讨论】:

    • 你能举个例子吗?
    【解决方案2】:

    我也遇到了同样的情况(虽然我有一个 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”文件夹并重新启动它允许我的应用程序部署。

    【讨论】:

      猜你喜欢
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 2016-03-20
      • 2016-06-17
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多