具有JAXB Random ClassCastException的Netbeans ..无法转换为com.sun.xml.bind.v2.runtime.reflect.Accessor

我从SOAP服务下载了Soap消息,并尝试通过返回下载的消息来模拟Soap服务。 以下代码显示了我如何将Soap消息解组为所需的响应

public static DataClientType unmarshallFile(String fileName) throws Exception { XMLInputFactory xif = XMLInputFactory.newFactory(); XMLStreamReader xsr = xif.createXMLStreamReader(ClientSampleSoapResponseData.class.getResourceAsStream(fileName)); xsr.nextTag(); // Advance to Envelope tag xsr.nextTag(); // Advance to Header xsr.nextTag(); // Advance to Body tag xsr.nextTag(); // Advance to getClientByAccountResponse xsr.nextTag(); // Advance to content of getClientByAccountResponse JAXBContext jc = JAXBContext.newInstance(GetClientByAccountResponse.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); JAXBElement je = unmarshaller.unmarshal(xsr, GetClientByAccountResponse.class); return je.getValue().getClientDataContract(); } 

但是我继续得到随机发生的ClassCastExeption。 经过多次测试迭代后,它开始发生。 有时一个干净的构建修复它,但有时它不起作用。

 java.lang.ClassCastException: com.xXXXGetClientByAccountResponse$JaxbAccessorF_clientDataContract cannot be cast to com.sun.xml.bind.v2.runtime.reflect.Accessor at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.instanciate(OptimizedAccessorFactory.java:188) at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:180) at com.sun.xml.bind.v2.runtime.reflect.Accessor$FieldReflection.optimize(Accessor.java:256) at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.(SingleElementNodeProperty.java:90) 

我已经尝试过其他在线建议,例如恢复旧的jaxb版本并在maven编译器配置中使用已签名的文件夹,但它仍然会发生

关于什么可能导致它和可能的解决方案的任何想法?

感谢你

解决了以下代码

 @BeforeClass public static void init(){ System.setProperty( "com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true"); } @AfterClass public static void revert(){ System.getProperties().remove("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize"); } 

也可以使用JVM设置参数

 -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true 

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

就我而言,问题是我的应用程序使用了Web服务,而且我也没有外化JAX-WS。 该应用程序使用com.sun.xml.bind.v2.runtime类开始,但当它开始使用WSDL文件时,内部JAX-WS尝试调用com.sun.xml。 内部 .bind.v2.runtime类。 当我下载并安装JAX-WS时,错误消失了,我能够继续升级。

我在我的一个应用程序中遇到了同样的问题。 就我而言,该项目使用的是使用Java 1.5兼容性编译的库,而主项目与1.6版兼容。 当我改为使用1.6时,问题就消失了。 我希望这能够帮助某人,因为问题可能非常令人沮丧且难以追踪。

在Intellij中,我接受的解决方案对我有用,但是从命令行运行maven时我遇到了同样的错误。 将此添加到maven-surefire-plugin的配置中也解决了问题:

   org.apache.maven.plugins maven-surefire-plugin   true    

我从build.sbt中删除了对单独的jaxb-impl jar的依赖。 现在有效。

我有类似的问题,但我没有/没有依赖(-version-mismatch)-problem。

在我的例子中,一个类缺少@XmlAccessorType ,添加此注释解决了我的问题。 根据您的情况,解决方案将是:

 import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @XmlAccessorType(XmlAccessType.FIELD) // check, if @XmlAccessorType is missing public class GetClientByAccountResponse { .. 

在运行时通过父pom中的依赖项管理器包含jaxbiimpl jar将解决此问题。 此解决方案特定于maven项目。