【问题标题】:Migration jboss to tomcat - javax.naming.NamingException将 jboss 迁移到 tomcat - javax.naming.NamingException
【发布时间】:2020-04-17 03:45:15
【问题描述】:

我们正在将 Struts 1.2 项目从 JDK 1.6 迁移到 1.8,并将应用服务器 jboss5.1 迁移到 tomcat 8.0。数据库连接工作正常,初始页面正在加载和填充一些数据。但是当我执行任何操作(提交按钮)时,它会引发异常javax.naming.NamingException: Cannot create resource instance 相同的代码在 jboss 5.1 中工作,但在 Tomcat 8 中出现错误。

但我怀疑错误的原因是 UserTransaction 需要在 context.xml 中单独定义,但不确定。请告诉我。

UserTransaction ut = (UserTransaction) myCntxt.lookup("java:comp/UserTransaction");

如果需要定义UserTransaction,请告诉我如何在Tomcat服务器中配置?

在 META-INF/context.xml 下的 context.xml 中添加数据库配置

<Resource name="jdbc/Test1" 
   auth="Container" 
   type="javax.sql.DataSource" 
   maxTotal="100" 
   maxIdle="30" 
   maxWaitMillis="10000" 
   username="xxxxx" 
   password="xxxxx" 
   driverClassName="oracle.jdbc.OracleDriver" 
   url="jdbc:oracle:thin:@xxxx:1527:xxxx" />

<Resource name="jdbc/Test2" 
   auth="Container" 
   type="javax.sql.DataSource" 
   maxTotal="100" 
   maxIdle="30" 
   maxWaitMillis="10000" 
   username="xxxxx" 
   password="xxxxx" 
   driverClassName="oracle.jdbc.OracleDriver" 
   url="jdbc:oracle:thin:@xxxx:1527:xxxx" />

在 {project}/WEB-INF/web.xml 下的 web.xml 中添加数据源引用

<resource-ref>
   <description>Oracle Datasource</description>
   <res-ref-name>jdbc/Test1</res-ref-name>
   <res-type>javax.sql.DataSource</res-type>
   <res-auth>Container</res-auth>
</resource-ref>

<resource-ref>
   <description>Oracle Datasource</description>
   <res-ref-name>jdbc/Test2</res-ref-name>
   <res-type>javax.sql.DataSource</res-type>
   <res-auth>Container</res-auth>
</resource-ref>

示例代码

public static void dbInit(String test1dataSourceReference,String test2dataSourceReference) throws Exception
    {

        Context ctx = new InitialContext();
            tds =(DataSource) ctx.lookup("java:comp/env/" + test1dataSourceReference);
            cds = (DataSource) ctx.lookup("java:comp/env/" + test2dataSourceReference);

    }

堆栈跟踪:

Dec 25, 2019 7:28:07 AM org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.taglib.html.LocalStrings', returnNull=true
Dec 25, 2019 7:28:07 AM org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.util.LocalStrings', returnNull=true
Dec 25, 2019 7:28:07 AM org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.taglib.html.LocalStrings', returnNull=true
Dec 25, 2019 7:28:07 AM org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.taglib.html.LocalStrings', returnNull=true
Dec 25, 2019 7:28:08 AM org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.taglib.logic.LocalStrings', returnNull=true
Dec 25, 2019 7:28:08 AM org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.taglib.html.LocalStrings', returnNull=true
Dec 25, 2019 7:28:08 AM org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.taglib.html.LocalStrings', returnNull=true
Dec 25, 2019 7:28:22 AM org.apache.struts.action.RequestProcessor processException
WARNING: Unhandled Exception thrown: class javax.naming.NamingException
Dec 25, 2019 7:28:22 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [action] in context with path [/policy] threw exception [javax.naming.NamingException: Cannot create resource instance] with root cause
javax.naming.NamingException: Cannot create resource instance
    at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:96)
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:847)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:158)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:835)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:172)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:157)
    at javax.naming.InitialContext.lookup(Unknown Source)
    at com.db.DbQuery.saveAppRejValue(DbQuery.java:798)
    at com.actions.PolicyAction.executeDisplay(PolicyAction.java:298)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
    at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

【问题讨论】:

    标签: java tomcat jakarta-ee jndi jta


    【解决方案1】:

    TomEE Comparison page 表示 Tomcat 不支持 JTA (JSR 907):

    您要么需要删除 JTA 代码,要么考虑将另一个 EE 服务器(如 Wildfly)作为更简单的升级路径。

    【讨论】:

    • 谢谢。但我看到一些在 tomcat 之上的实现来支持 JTA。jotm.objectweb.org/current/jotm/doc/howto-tomcat-jotm.html
    • 嗯,JOTM 已经 10 年没有新版本了,而且该指南是为 Tomcat 4 编写的,也是从 10 年前开始的。您表示您正在迁移到不再受支持的 Tomcat 8.0。你需要做很多工作才能让它与你选择的平台一起工作。话虽如此,TomEE 可能会让您更接近,但同样不能使用 Tomcat 8.0,因为它已不再开发。
    • @user2848031 链接到的比较页面 stdunbar 直接来自 Apache。您链接到的页面来自“objectweb.org”,无论如何,根据 HTTP 标头最后一次修改是在 2003 年 12 月。总而言之,我认为 Apache 页面可能是准确的,因为它说 JTA 不是支持。
    • @stdunbar 只是想知道如果删除 JTA 代码和除 ORM 框架之外的替代方案。
    • @user2848031 - 从图表中可以看出,即使是开箱即用的 Tomcat 也不支持 JPA。 Tomcat 是一个servlet only 服务器,并且您有一个JEE 应用程序。您可以将碎片粘贴到 Tomcat 上,然后您可能会让它工作,或者您可以节省大量时间并使用 Wildfly、Glassfish 或 TomEE。您的应用程序中有 JTA 是有原因的 - 事务控制。您的测试和维护将受到巨大的应用程序更改的严重影响。我觉得你使用Tomcat走错了路。
    【解决方案2】:

    您可以在您的 Tomcat 中部署第 3 方 TransactionManager 解决方案(即 Atomikos),我们使用旧版本的 Tomcat 完成了此操作。我们现在在 JBoss 6 上运行 Struts1(和 Struts2)应用程序,因此代码与提供 JTA 实现的较新 JBoss 兼容。

    您可以从代码中删除事务边界(保留 ORM 和 DAO 代码),但我不确定这是一个好主意,因为数据不一致是一种风险。

    如果您想最小化更改,我会尝试升级到更新的 JBoss 版本。
    一个更好的中期解决方案是集成 Spring Transaction Management(如果您不需要跨多个资源处理事务)。
    一个长期的解决方案是重构 Struts1(可能是史诗般的努力,但我必须提到它)。

    祝你好运。

    贝佩

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-15
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      相关资源
      最近更新 更多