我有我想要的应用程序内调用一个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用户邮件列表,如果没有在这里出现。 –