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
_
私が今までに試したこと:
XMLとしてオブジェクトをマーシャリングするJAXBContextの作成に関する問題
System.setProperty( "com.Sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true");
を試しました。ただし、残念ながら私の環境では、このプロパティを設定することはオプションではありません。さらに、実際の問題に対処していないのはちょっとしたハックのようです(誤解していない限り)。私は私が残した小さなロープで自分を掛けようとしています。ここに何が欠けていますか?
私は自分の質問に答えるのは嫌いですが、最終的に解決策が明確に文書化されたことを確認したかったのです。
根本的な問題は、camel-jaxbによって取り込まれたjaxb-impl jarがJDK 8提供バージョンと競合することでした。
この回答 は何が起こっているかをより明確に説明しています:
JAXBをJDKに付属しているものよりも新しいバージョンにアップグレードしようとしたときに、同じエラーが発生しました。 Javaは実行時にJAXBの2つ以上のインスタンスに遭遇し、使用するバージョンを決定できませんでした。
私の場合、私は単にcamel-jaxbに付属するjaxb-implを除外し、アプリケーションは正常に動作し始めました。
テスト範囲で同じ問題に遭遇しました。私にとって、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>
Eclipseでローカルに合格したにもかかわらず、Mavenを介してJUnitテストを実行しようとすると、このエラーに遭遇しました。私の解決策は、@ BeforeClass putに入れることでした。
System.setProperty( "javax.xml.bind.JAXBContext"、 "com.Sun.xml.internal.bind.v2.ContextFactory");