具有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项目。