2017-02-28 1 views
6

私はアプリケーション内で呼び出しようとしているSOAP Webサービスを持っています。私はcxf-codegen-plugin(3.1.10)を使用してWSDLからソースを生成しています。ClassCastException:com.sun.xml.internal.bind.v2.runtime.reflect.Accessorにキャストすることができません

私がアプリケーション内のWebサービスを呼び出すと、生成されたクライアントを使用して、それは素晴らしい作品です。しかし、問題の原因となっているアプリケーション内の同じパッケージに対して別のJAXBインスタンスを使用しています。例えば

、次は素晴らしい作品:

次のスタックトレースで

JAXBContext.newInstance(SendMessageRequest.class); 

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

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

しかし、右の前に新しいJAXBインスタンスを初期化すると失敗するgetOutboundServicePort()呼び出します

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 

これまでに試したことがあります:

  • JAXB classes from Webservice marshalling error

    私はJDKフォルダには承認瓶を持っていないので、this answer
  • JAXB-IMPLジャー(2.2.11)がから来ている
  • それので、私のアプリでラクダは、JAXBは適用されません。非常に含まれているようで、this answerのようには思わない。
  • This answer問題をうまく説明しているようですが、解決策はわかりません。

Problems creating JAXBContext to marshal object as XML

  • この質問は私と同じのようですが、彼らは一緒に行くことになった解決策は、私の状況のた​​めに働くことはできません(下記参照)

Netbeans with JAXB Random ClassCastException ..cannot be cast to com.sun.xml.bind.v2.runtime.reflect.Accessor

  • 私は受け入れた解決策を試しましたSystem.setProperty("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true");で動作します。しかし、このプロパティを設定することは、私の環境では残念なことに私の選択肢ではありません。さらに、実際の問題に対処していないようなハックのようだ(私が誤解していない限り)。

私は残した小さなロープで自分自身をハングアップしています。私はここで何が欠けていますか?

+0

私はあなたに答えがありませんが、あなたがリンクしている理解できない答えによって暗示されているように、おそらく2つの別々のクラスローダーのように聞こえます。また、私はその 'noOptimize'オプションに関する情報を少なくとも少々掘り下げることができました:http://cxf.547215.n5.nabble.com/JAXB-is-not-sitting-well-in-an-OSGI -eclipse-env-tp569834p569839.html、私はjaxbが本当に奇妙なことをしていると思いますが、あなたが何をしているのかはわかりません。答えを見ることに興味があります。 Btwも何もここに来なければjaxbユーザーのメーリングリストに尋ねることを検討してください。 –

答えて

4

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

根本的な問題は、camel-jaxbによってもたらされたjaxb-impl jarファイルがJDK 8提供バージョンと競合していたことでした。

This answerはより明確に何が起こっているのかを説明します。

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

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

関連する問題