2017-02-28 475 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,并且应用程序开始正常工作。

相关问题