3

我有一个在 Tomcat 中正确运行的 Web 应用程序,我想在新的 OpenLiberty 服务器上运行,该应用程序在 OpenLiberty 内正确启动,但在数据库连接启动时抛出以下异常:

[Default Executor-thread-15] 2018-03-15 15:02:30 ERROR TomcatConnectionManager:41 - Loading jdbc/mysql/myaap failure
javax.naming.NameNotFoundException: java:/comp/env
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLName.<init>(JavaURLName.java:83)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLNameParser.parse(JavaURLNameParser.java:39)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLNameParser.parse(JavaURLNameParser.java:60)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext$NameUtil.<init>(JavaURLContext.java:474)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext.lookup(JavaURLContext.java:321)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext.lookup(JavaURLContext.java:370)
    at org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:161)

在查找阶段抛出上述异常:

Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");

有没有办法让它在 OpenLiberty 上工作,做更少的改变?

4

2 回答 2

4

在 OpenLiberty 上,等效查找如下所示:

    Context initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup("java:comp/env");

关键是你需要使用java:comp/...而不是java:/comp/...


Tomcat 与 Liberty 不同的原因是 Tomcat 只是一个 servlet 容器,而 Liberty 符合完整的 Java EE 规范。

根据Java EE 7 规范的 EE.5.2.2部分:

应用组件的命名环境由四个逻辑命名空间组成,分别代表不同范围的命名环境。这四个命名空间是:

  • java:comp – 此命名空间中的名称是每个组件的(例如,每个企业 bean)。除了 web 模块中的组件,每个组件都有自己的 java:comp 命名空间,不与任何其他组件共享。Web 模块中的组件没有自己的私有组件命名空间。请参阅下面的注释。
  • java:module – 此命名空间中的名称由模块中的所有组件共享(例如,单个 EJB 模块中的所有企业 bean,或 Web 模块中的所有组件)。
  • java:app – 此命名空间中的名称由单个应用程序中的所有模块中的所有组件共享,其中“单个应用程序”表示单个部署单元,例如单个 ear 文件、独立部署的单个模块等。例如,同一个ear 文件中的war 文件和EJB jar 文件都可以访问java:app 命名空间中的资源。
  • java:global – 此命名空间中的名称由部署在应用程序服务器实例中的所有应用程序共享。请注意,应用程序服务器实例可能代表单个服务器、服务器集群、包含许多服务器的管理域,甚至更多。应用程序服务器实例的范围取决于产品,但必须能够将多个应用程序部署到单个应用程序服务器实例。
于 2018-03-15T15:37:59.100 回答
0

在 WebSphere 和 Tomcat 之间有类似的问题。我正在 Tomcat 服务器上进行开发和测试,并使用我无法更改的实用程序来处理与我们的 DB2 的数据库连接。在 WebSphere 上,当我配置 Tomcat 和解析为“java:comp/env/jdbc/SFCCDB2”的 Web.xml 文件时,它使用设置为“jdbc/COMPDB2”的常量来检索数据源

我在本地工作空间上的工作是添加一个侦听器以将资源复制到 InitialContext 中的级别。我对服务器端的事情不是很有经验,但到目前为止,这是使用 TomEE 7.0.81 工作的。

        InitialContext ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/SFCCDB2");
        javax.naming.Context envCtx = (javax.naming.Context) ctx.lookup("java:comp/env");
        try{
            /*
            Added this because after redeploying code to the server it would error 
            connecting to the DB with an SQLException Datasource is closed
             */
            DataSource dataSource = (DataSource) ctx.lookup("jdbc/COMPDB2");
            ctx.destroySubcontext("jdbc");
        } catch (NamingException e){
            //Doesn't exist; safe to just add
        }
        ctx.createSubcontext("jdbc");
        ctx.bind("jdbc/COMPDB2", ds);
        ctx.close();
于 2020-03-13T11:10:58.613 回答