ClassCastException:不能施放到com.sun.xml.internal.bind.v2.runtime



我有一个我试图在应用程序内部调用的SOAP Web服务。我正在使用CXF-Codegen-Plugin(3.1.10)从WSDL生成源。

使用生成的客户端,如果我在应用程序中调用Web服务,则效果很好。但是,我还使用另一个JAXB实例针对应用程序中的同一软件包的实例。

例如,以下功能很棒:

OutboundServicePortType service = new OutboundService().getOutboundServicePort();
service.sendMessage(message);

但是,在导致getOutboundServicePort()调用失败之前,初始化一个新的JAXB实例:

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类来自Web服务编组错误

  • 我在JDK文件夹中没有认可的罐子,所以此答案不适用
  • jaxb-impl jar(2.2.11)来自我的应用中的骆驼 - 贾克斯布
  • 这个答案似乎很好地描述了问题,但是他们所采用的解决方案似乎对我来说尚不清楚。

问题以xml

创建jaxbcontext到元帅对象
  • 这个问题似乎与我相同,但是他们最终使用的解决方案对我的情况无法使用(见下文)

带有jaxb随机classcastException的netbeans。

  • 我尝试了可接受的解决方案System.setProperty( "com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true");工作。但是,不幸的是,在我的环境中,设置此属性不是我的选择。另外,似乎这是一个无法解决实际问题的黑客(除非我误解了它)。

我将用留下的小绳子吊死自己。我在这里缺少什么?

我不愿回答自己的问题,但是我想确保清楚地记录了我最终使用的解决方案。

根问题是,骆驼jaxb带来的jaxb-impl jar与JDK 8提供的版本冲突。

此答案描述了更清楚地发生的事情:

当我尝试将JAXB升级到更新时,我遇到了相同的错误 版本比JDK随附的版本。爪哇遇到了两个或更多 JAXB在运行时的实例,无法决定要哪个版本 使用。

就我而言,我只是排除了Camel-Jaxb随附的JAXB-IMPL,并且应用程序开始正常工作。

我在试图通过Maven运行我的Junit测试时遇到了这个错误,即使它们在Eclipse本地通过。我的解决方案是在@BeforeClass put中:

System.setProperty("javax.xml.bind.JAXBContext", "com.sun.xml.internal.bind.v2.ContextFactory");

如果您在2.2.6上使用Spring Boot。

&lt; glassfish-jaxb.version&gt; 2.3.2&lt;/glassfish-jaxb.version&gt;

因为在下一个版本中,它更改了java.xml.bind实现:

看一个pom即:

https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb/jaxb-runtime/2.3.5/jaxb-runtime-2.3.5.pom:

-add-opens org.glassfish.jaxb.runtime/com.sun.xml.bind.v2 = java.xml.xml.bind -add-opens-add-opens org.glassfish.jaxb.runtime/com.sun.xml。bind.v2.schemagen = java.xml.bind -add-opens org.glassfish.jaxb.runtime/com.sun.sun.xml.bind.bind.v2.schemagen.xmlidref = java.xml.xml.xml.xml.bind-add-add-add-opens java。base/java.lang = org.glassfish.jaxb.runtime -add-opens java.base/java.lang.reflect = org.glassfish.jaxb.runtime-add-opens-add-opens org.glassfish.glassfish.jaxb.jaxb.runtime/com。sun.xml.bind.v2.runtime.reflect.opt = java.xml.bind

我在测试范围中遇到了同一问题。对我来说,添加JAXWS-RT运行时罐有帮助。请注意,我只为测试范围添加了它。您不会为产品运行时执行此操作,因为JEE容器应该已经具有此或其他实现。

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>2.2.3</version>
    <scope>test</scope>
</dependency>

最新更新