2017-02-28 477 views
6

我有我想要的應用程序內調用一個SOAP Web服務。我正在使用cxf-codegen-plugin(3.1.10)從WSDL生成源代碼。ClassCastException異常:不能轉換到com.sun.xml.internal.bind.v2.runtime.reflect.Accessor

使用生成的客戶端,如果我叫應用程序中的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 

事情我至今嘗試過:

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

我對你沒有答案,但它聽起來像是兩個不同的班級裝載機,就像你連接的那個難以理解的答案所暗示的那樣。此外,我還能夠在「noOptimize」選項上至少挖掘出一些信息:http://cxf.547215.n5.nabble.com/JAXB-is-not-sitting-well-in-an-OSGI -eclipse-env-tp569834p569839.html,我猜jaxb做了一些非常奇怪的事情,雖然我不確定你在做什麼,這觸發了這個問題。有興趣看到答案。順便說一句,也考慮問問jaxb用戶郵件列表,如果沒有在這裏出現。 –

回答

4

我不想回答我的問題,但我想確保我結束了明確記載去解決。

根本問題是由駱駝JAXB帶來了JAXB的罐子IMPL是用JDK 8提供的版本衝突。

This answer描述所發生的事情更清楚:

我遇到了同樣的錯誤,當我試圖JAXB升級到新版本 比使用JDK什麼來。Java在運行時遇到兩個或更多個JAXB實例,無法決定使用哪個版本的 。

就我而言,我只是排除了camel-jaxb附帶的jaxb-impl,並且應用程序開始正常工作。

相關問題