我有一个我试图在应用程序内部调用的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>