0

Web サービス呼び出しに CXF を使用したい WebSphere 9.0.5.2 にデプロイされたアプリケーションがあり、この This ServiceConfigurationError を取得しています

WrapperedException { java.util.ServiceConfigurationError: javax.xml.ws.spi.Provider: Provider org.apache.cxf.jaxws.spi.ProviderImpl could not be instantiated 

スタックトレースをさらに下ると、これは LinkageError が原因であることがわかります

Caused by: java.lang.LinkageError: loading constraint violation when overriding method
  "javax/xml/ws/spi/ServiceDelegate.createDispatch(Ljavax/xml/namespace/QName;Ljavax/xml/bind/JAXBContext;Ljavax/xml/ws/Service$Mode;)Ljavax/xml/ws/Dispatch;" during creation of class
  "org/apache/cxf/jaxws/ServiceImpl": loader
  "com/ibm/ws/classloader/CompoundClassLoader@832133d2" of class
  "org/apache/cxf/jaxws/ServiceImpl" and loader
  "com/ibm/oti/vm/BootstrapClassLoader@2eec706a" of class
  "javax/xml/ws/spi/ServiceDelegate" have different types for the method signature 

QNameこれは、またはの定義が異なる複数のライブラリが原因である可能性があることは理解していますがJAXBContext、それらを除外したと思います。

また、WebSphereにはServiceDelegate.createDispatchの独自のメソッド署名を持つ独自のJAX-WSがあることも理解しており、DisableIBMJAXWSEngineここで指示されているようにWebSphereでtrueに設定しようとしました

サードパーティの JAX-WS Web サービス エンジンの使用

私はまだエラーを取り除くことができず、次に何を試すべきかについてほとんど途方に暮れています. どんな提案でも大歓迎です!!!

4

1 に答える 1

1

ここでの問題は、アプリケーションとサーバーの JAXB API、JAX-WS API、および JAX-WS 実装のコピーとの間の相互リンクです。アプリケーション (parent-last クラス読み込み委譲で構成されているため、親に委譲する前にローカルで検索します) には JAX-WS 実装と JAXB API/impl が含まれていますが、JAX-WS API は含まれていません。JAX-WS は JAXB を参照するため、次のリンケージ パターンが得られます。

1) 一部のアプリケーション クラスは JAX-WS API を参照します。アプリケーションにパッケージ化されていないため、サーバー ライブラリから読み込まれます。

2) API クラスがリンクされると、そのローカル クラス ローダーを使用して JAXB API を見つけます。これにより、サーバーのバージョンにもリンクされます。

3) JAX-WS は、スレッド コンテキスト クラス ローダーを使用してその実装をロードします。親最後のアプリケーションでそれを見つけます。

4) 実装クラスがリンクされると、そのローカル クラス ローダーを使用して JAXB API が検索され、アプリケーション内でローカルに検索されます。

5) 実装は、同じクラスの 2 つのバージョンにリンクされるようになりました。

JAXWSImpl -> JAXWSAPI -> JAXB (サーバー) JAXWSImpl -> JAXB (アプリ)

JVM はそれを許容できず、LinkageError がスローされます。

ソリューションには、次の 2 つの方法のいずれかでアプローチできます。

1) JAX-WS API をアプリケーションに追加します。これにより、上記 #1 の最初の委譲が防止されます。

2) アプリケーションから JAXB API (および提供されている場合は実装) を削除します。これにより、#4 のリンケージが JAXB のサーバーに委譲されるため、常に同じ場所からロードされます。

いずれにせよ、秘訣は、必要なすべてのクラスが同じクラス ローダーを介してアプリケーションで利用できるようにすることです。

于 2020-05-22T12:49:19.753 に答える