0

Apache Tomcat 7.0.47内のローカル環境 [http://localhost:8080/myApp/] で完全に実行される Web アプリケーションがあります。Spring Frameworkを使用しています。

この問題は、Web アプリケーションをOracle Application Server 10g、バージョン 10.1.3.4.0にデプロイした後に発生します。アプリケーションが AS に正常にデプロイされました。しかし、アプリケーションをリクエストしようとすると、サーバーは次のように応答します。


500内部サーバーエラー

サーブレット エラー: 例外が発生しました。現在のアプリケーション デプロイメント記述子では、この応答にそれを含めることは許可されていません。詳細については、アプリケーション ログを参照してください。


私の診断を提供させてください:

  1. Web コンテナーは myApp.ear を正常にデプロイします
  2. デプロイメント後、Web コンテナーは以下を実行します。
    • LOADSサーブレット クラス
    • ロードされたサーブレット クラスをインスタンス化します
    • インスタンスの init() メソッドを実行します ----> IT はここで失敗します

これが私のアプリケーション ログのスニペットです。

14/02/18 09:26:56.617 etrr: Initializing Spring FrameworkServlet 'spring'
14/02/18 09:26:57.105 etrr: Error initializing servlet
java.lang.NoSuchMethodError: org.springframework.beans.factory.config.ConfigurableListableBeanFactory.registerResolvableDependency
    (Ljava/lang/Class;Ljava/lang/Object;)V
    at org.springframework.web.context.support.WebApplicationContextUtils.registerWebApplicationScopes(WebApplicationContextUtils
    .java:156)
    at org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.postProcessBeanFactory(AbstractRefreshableWebApplicationContext
    .java:143)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:331)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:332)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:266)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:236)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:126)
    at javax.servlet.GenericServlet.init(GenericServlet.java:256)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.HttpApplication.loadServlet(HttpApplication.java:2379
    )
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.HttpApplication.findServlet(HttpApplication.java:4830
    )
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.HttpApplication.findServlet(HttpApplication.java:4754
    )
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.HttpApplication.getRequestDispatcher(HttpApplication
    .java:3412)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler
    .java:738)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.HttpRequestHandler.processRequest(HttpRequestHandler
    .java:453)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.AJPRequestHandler.run(AJPRequestHandler.java:313)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.AJPRequestHandler.run(AJPRequestHandler.java:199)
    at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
    at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:234)
    at oracle.oc4j.network.ServerSocketAcceptHandler.access$700(ServerSocketAcceptHandler.java:29)
    at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:879)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor
    .java:303)
    at java.lang.Thread.run(Thread.java:595)

私の OC4J コンテナは、私の Web アプリケーションにパッケージ化されたクラスをロードするため、システム クラスまたは OC4J コンテナの上位レベルのクラスをオーバーライドすることはおそらく正しいでしょう。../WEB-INF/orion-web.xmlファイルに次の 2 つのプロパティを記述しました。(詳細については、@drorbの回答を参照してください)

<web-app-class-loader search-local-classes-first="true" 
                      include-war-manifest-class-path="true" />

よろしくお願いいたします。

4

2 に答える 2

1

クラスローディングの問題のようです。スタックトレースは、アプリケーション クラスパスのどこかに古いバージョンの Spring があることを示しました。クラスローダが、要求されたシグネチャをorg.springframework.beans.factory.config.ConfigurableListableBeanFactory持つメソッドを持たない古いバージョンをロードしています。 このクラスは、spring-beans jar の一部です。古いバージョンでは、それは spring-core の一部でした。registerResolvableDependency

class.load.traceOC4J クラスローディングのトレースには、システム プロパティ を使用できます。詳細については、OTN コミュニティのこの回答をご覧ください。

于 2014-02-18T10:22:37.080 に答える
0

問題の原因がわかりました。

../myWebApp/WEB-INF/libの下に、すべてのorg.springframework.X-3.0.2.RELEASE JAR があります。しかし、内部には別のspring.jarもあります。その MANIFEST ファイルには Spring v. 2.0.7と記載されているため、異なる Spring バージョン間で競合が発生します。

私はこのアプリケーションの作成者ではないので、この春の JAR ライブラリを見落としていました。このエラーは、ANT スクリプトを変更することで解決しました。つまり、Enterprise ARchive をビルドするときに、前述の JAR ファイルを除外しました。

于 2014-02-19T09:57:43.513 に答える