web-dev-qa-db-ja.com

ClassCastException:com.Sun.xml.internal.bind.v2.runtime.reflect.Accessorにキャストできません

SOAPアプリケーション内で呼び出そうとしているWebサービスがあります。cxf-codegen-plugin(3.1.10)を使用してWSDLからソースを生成しています。

生成されたクライアントを使用して、アプリケーション内でWebサービスを呼び出すと、うまく機能します。ただし、アプリケーション内の同じパッケージに対して別のJAXBインスタンスを使用しているため、問題が発生しています。

たとえば、次のようにうまく機能します。

_OutboundServicePortType service = new OutboundService().getOutboundServicePort();
service.sendMessage(message);
_

ただし、直前に新しいJAXBインスタンスを初期化すると、getOutboundServicePort()呼び出しが失敗します。

_JAXBContext.newInstance(SendMessageRequest.class);

OutboundServicePortType service = new OutboundService().getOutboundServicePort();
service.sendMessage(message);
_

次のスタックトレースで:

_Caused by: Java.lang.ClassCastException: outbound.model.standard.StandardOutboundMessage$JaxbAccessorF_messageUUId cannot be cast to com.Sun.xml.internal.bind.v2.runtime.reflect.Accessor
    at com.Sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.instanciate(OptimizedAccessorFactory.Java:190)
    at com.Sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.Java:179)
    at com.Sun.xml.internal.bind.v2.runtime.reflect.Accessor$FieldReflection.optimize(Accessor.Java:271)
    at com.Sun.xml.internal.bind.v2.runtime.property.SingleElementLeafProperty.<init>(SingleElementLeafProperty.Java:77)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:62)
    at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:45)
    at Java.lang.reflect.Constructor.newInstance(Constructor.Java:422)
    at com.Sun.xml.internal.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.Java:113)
    at com.Sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.Java:166)
    at com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.Java:488)
    at com.Sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.Java:153)
    at com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.Java:488)
    at com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.Java:305)
    at com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.Java:124)
    at com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.Java:1123)
    at com.Sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.Java:147)
    at com.Sun.xml.internal.bind.api.JAXBRIContext.newInstance(JAXBRIContext.Java:152)
    at com.Sun.xml.internal.bind.api.JAXBRIContext.newInstance(JAXBRIContext.Java:96)
    at com.Sun.xml.internal.ws.developer.JAXBContextFactory$1.createJAXBContext(JAXBContextFactory.Java:98)
    at com.Sun.xml.internal.ws.db.glassfish.JAXBRIContextFactory.newContext(JAXBRIContextFactory.Java:79)
    ... 25 more
_

私が今までに試したこと:

WebサービスマーシャリングエラーのJAXBクラス

  • JDKフォルダーに承認済みのjarがないため、 この回答 は適用されません
  • Jaxb-impl jar(2.2.11)は私のアプリのcamel-jaxbから来ているので、非常に含まれており、 この答え が示唆するようではありません。
  • この回答 は問題をうまく説明しているように見えますが、彼らがとった解決策は私には不明確なようです。

XMLとしてオブジェクトをマーシャリングするJAXBContextの作成に関する問題

  • この質問は私の質問と同じように見えますが、彼らが最終的に解決する解決策は私の状況では機能しません(以下を参照)

JAXB Random ClassCastExceptionが設定されたNetbeans ..com.Sun.xml.bind.v2.runtime.reflect.Accessorにキャストできません

  • 私はdoes動作する受け入れられたソリューションSystem.setProperty( "com.Sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true");を試しました。ただし、残念ながら私の環境では、このプロパティを設定することはオプションではありません。さらに、実際の問題に対処していないのはちょっとしたハックのようです(誤解していない限り)。

私は私が残した小さなロープで自分を掛けようとしています。ここに何が欠けていますか?

13
Tyler Murry

私は自分の質問に答えるのは嫌いですが、最終的に解決策が明確に文書化されたことを確認したかったのです。

根本的な問題は、camel-jaxbによって取り込まれたjaxb-impl jarがJDK 8提供バージョンと競合することでした。

この回答 は何が起こっているかをより明確に説明しています:

JAXBをJDKに付属しているものよりも新しいバージョンにアップグレードしようとしたときに、同じエラーが発生しました。 Javaは実行時にJAXBの2つ以上のインスタンスに遭遇し、使用するバージョンを決定できませんでした。

私の場合、私は単にcamel-jaxbに付属するjaxb-implを除外し、アプリケーションは正常に動作し始めました。

10
Tyler Murry

テスト範囲で同じ問題に遭遇しました。私にとって、jaxws-rtランタイムjarの追加が役立ちました。テストスコープにのみ追加したことに注意してください。 JEEコンテナにはすでにこの実装または他の実装があるはずなので、prodランタイムに対してこれを行うことはありません。

<dependency>
    <groupId>com.Sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>2.2.3</version>
    <scope>test</scope>
</dependency>
0
PetroCliff

Eclipseでローカルに合格したにもかかわらず、Mavenを介してJUnitテストを実行しようとすると、このエラーに遭遇しました。私の解決策は、@ BeforeClass putに入れることでした。

System.setProperty( "javax.xml.bind.JAXBContext"、 "com.Sun.xml.internal.bind.v2.ContextFactory");

0
Student