我有我想要的應用程序內調用一個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
- 這個問題似乎是相同的地雷,但解決的辦法,他們結束了與我的情況不能工作(請參見下文)
- 我試過接受的解決方案
System.setProperty("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true");
其中確實工作。但是,在我的環境中,設置此屬性對我來說不是一個不幸的選擇。另外,它似乎是一個黑客,不解決真正的問題(除非我誤解它)。
我對與小繩子我已經離開上吊。我在這裏錯過了什麼?
我對你沒有答案,但它聽起來像是兩個不同的班級裝載機,就像你連接的那個難以理解的答案所暗示的那樣。此外,我還能夠在「noOptimize」選項上至少挖掘出一些信息:http://cxf.547215.n5.nabble.com/JAXB-is-not-sitting-well-in-an-OSGI -eclipse-env-tp569834p569839.html,我猜jaxb做了一些非常奇怪的事情,雖然我不確定你在做什麼,這觸發了這個問題。有興趣看到答案。順便說一句,也考慮問問jaxb用戶郵件列表,如果沒有在這裏出現。 –