0

spring と JAX-WS を使用して Web サービス クライアントを作成しているときに、次のエラーが発生します。

それについてたくさんグーグルで私が気づいた

これは、古いバージョンの JAXB (jaxb-impl:jar:2.1.3:compile) が原因で発生しています。このバージョンは、maven によって推移的にフェッチされ、競合が発生しています。

を使用して修正しようとしました

  1. JAXB 2.x を jre/lib/endorsed フォルダーに入れることで..しかし、助けにはなりません
  2. 推移的な依存関係フェッチを除外することで、この問題を解決できるかどうかを知りたいです。
  3. Maven に推移的な依存関係をフェッチしないように強制し、言及された依存関係のみを使用するように強制する方法を知る必要があります。

しかし、私のすべての試みは失敗しました..誰かがこの問題で私を助けてくれますか

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:107)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
    at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
    at $Proxy21.isValidEmail(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.doInvoke(JaxWsPortClientInterceptor.java:520)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.doInvoke(JaxWsPortClientInterceptor.java:494)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.invoke(JaxWsPortClientInterceptor.java:481)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy22.isValidEmail(Unknown Source)
    at com.rosettastone.succor.webservice.EmailValidateClientImpl.main(EmailValidateClientImpl.java:15)
Caused by: java.lang.ClassCastException: com.sun.xml.bind.v2.runtime.JAXBContextImpl cannot be cast to com.sun.xml.internal.bind.api.JAXBRIContext
    at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.<clinit>(SOAPFaultBuilder.java:533)
    ... 15 more
4

3 に答える 3

1

この例外は、JAX-WS と JAXB が異なるクラス ローダーからロードされていることが原因である可能性が最も高いです。これらのライブラリはもともと JDK とは別に開発されたため、アプリケーションの一部としてデプロイする必要がありましたが、現在は JDK の一部になっています。それらをアプリケーションの一部としてデプロイし続けると、それらがクラス パスで 2 回使用可能になり、ClassCastException などの相互運用性の問題が発生する可能性があります。

最も簡単な解決策は、アプリケーションと共にそれらをデプロイしないことです。これが maven によって管理される推移的な依存関係である場合は、それを除外することで実行できます。日食では、これは次のように簡単です。

  • プロジェクトの pom を pom エディター (pom ファイルのデフォルトのエディター) で開きます。
  • 依存関係階層タブを選択します
  • 問題のある依存関係を右クリックします
  • 「Mavenアーティファクトを除外」を選択します
于 2013-02-01T18:13:02.737 に答える
0

mvn dependency:tree を実行してすべての依存関係ツリーを取得し、問題の原因となる依存関係を除外できます。

jaxws/jaxb の問題に関しては、特定のバージョンを指定する方法はたくさんありますが、正確に何を意図していたのかを知る必要があります。(wsgen、wsimport、実行時に問題が発生しましたか?)

于 2012-06-08T09:06:50.827 に答える
0

jersey-json pom が jaxb-impl の明示的なバージョンをプルしていた場所にこれをヒットしました。その依存関係を除外するmavenは、私にとってはうまくいきました。

詳細はこちら:

http://jersey.java.net/nonav/documentation/latest/chapter_deps.html

(なぜ異なるバージョンの api クラスと impl クラスを取得していたのか完全にはわかりません。jaxb-impl pom が優先する jaxb-api を取り込むため、AFAICT でファンキーなクラスローディングが行われることはなかったので、JRE からロードするか、明示的な jaxb JAR からロードするかに関係なく、 、互換性のあるクラスがあったはずですが...そうではなく、除外によりすべてが機能しました!)

于 2013-01-07T17:24:37.733 に答える