ClassCastException:无法强制转换为 com.sun.xml.internal.bind.v2.runtime.reflect.Accessor
我有一个 SOAP Web 服务,我尝试在应用程序内部调用它。我正在使用cxf-codegen-plugin(3.1.10)从WSDL生成源代码。
使用生成的客户端,如果我在应用程序中调用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
到目前为止,我尝试过的事情:
- 我的JDK文件夹中没有背书的jar,所以这个答案不适用
- jaxb-impl jar (2.2.11) 来自我的应用程序中的 camel-jaxb,所以它看起来非常包含,不像这个答案所暗示的那样。
- 这个答案似乎很好地描述了问题,但他们采取的解决方案对我来说似乎不清楚。
创建 JAXBContext 以将对象封送为 XML 时出现问题
- 这个问题似乎与我的问题相同,但是他们最终采用的解决方案不适用于我的情况(见下文)
Netbeans with JAXB Random ClassCastException ..不能强制转换为 com.sun.xml.bind.v2.runtime.reflect.Accessor
- 我尝试了可接受的解决方案,它确实有效。但是,不幸的是,在我的环境中,设置此属性对我来说不是一个选项。另外,这似乎是一个没有解决真正问题的黑客攻击(除非我误解了它)。
System.setProperty( "com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true");
我正要用我剩下的那根小绳子上吊自杀。我在这里错过了什么?