【问题标题】:WebSphere External Jar JNDI bindingsWebSphere 外部 Jar JNDI 绑定
【发布时间】:2013-10-14 11:15:39
【问题描述】:

我有一个 Java EE 应用程序,它使用一个外部 jar(用于记录目的),但它需要一个用于配置的 URL,该 URL 在 jar 本身中通过 JNDI 查找解析。

一些澄清示例:

LoggingLib.jar: -> LoggingFactory.java

public void resolveJndi(){
     Context ctx = new InitialContext();
     URL myConf = ctx.lookup('url/myConf');
}

这个库包含在实际应用程序的 EAR 文件中,并在应用程序的各个类中调用(在 web 模块、ejb 模块中,甚至在另一个带有 JPA 类的 jar 中)。

如果 jndi name 'url/myConf' 存在,一切正常:但我需要将其映射到部署时指定的个性化名称。 对于其他资源,我已经使用 ibm 绑定解决了这个问题:在部署时,系统会询问这些资源的真正 jndi 名称。这样,软件和配置之间就解耦了:应用程序将查找 java:comp/env/url/myConf 但服务器将使用它的真实名称解析它。 我尝试对 application.xml 和 ibm-application-bnd.xml 做同样的事情,但没有成功。

进行此类引用的正确方法是什么?

【问题讨论】:

    标签: binding websphere jndi websphere-8


    【解决方案1】:

    这通常使用URL providers 完成。您需要在进行查找的组件中定义对资源环境的引用:

    <resource-env-ref>
        <resource-env-ref-name>local_url_reference</resource-env-ref-name>
        <resource-env-ref-type>java.net.URL</resource-env-ref-type>
    </resource-env-ref>
    

    然后在定义了 URL 资源之后,您就可以将它绑定到本地组件的命名空间中。 ibm-ejb-jar-bnd.xml 看起来像这样(对于 EJB):

      <session name="YourBean">
        <resource-env-ref name="local_url_reference" binding-name="global_url_reference"/>
      </session>
    

    【讨论】:

    • 您还没有阅读所有问题:我完全知道如何在 web 模块和 ejbs 上指定资源,我的问题是如何为包含在所有文件中的外部 jar 指定资源项目。目前我在所有 ejb 和 web.xml 中指定相同的资源,但这是一种肮脏的方式,我在问是否可以在 application.xml 或类似的东西上指定它
    • 我认为很明显绑定是为 Java EE 组件指定的,而任意 JAR 不是。