使用JAXB随机ClassCastException .的Netbeans不能强制转换为com.sun.xml.bind



我已经从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<GetClientByAccountResponse> je = unmarshaller.unmarshal(xsr, GetClientByAccountResponse.class);
    return je.getValue().getClientDataContract();
}

然而,我一直得到这个随机发生的classcastexception。在多次测试迭代之后,它开始发生。有时清理和构建可以修复它,但有时它不起作用。

java.lang.ClassCastException: com.x.X.X.X.GetClientByAccountResponse$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.<init>(SingleElementNodeProperty.java:90)

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

有什么想法可以导致它和可能的解决方案吗?

感谢u

用以下代码解决

@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的配置中也解决了那里的问题:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <systemPropertyVariables>
                    <com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize>true</com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize>
                </systemPropertyVariables>
            </configuration>
        </plugin>

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

我有一个类似的问题,但我没有/没有依赖(-版本不匹配)的问题。

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

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

在我的例子中,问题是我的应用程序使用了web服务和spring数据。我排除工件org.glassfish.jaxb包含com.sun.xml.bind.v2.runtime.reflect.Accessor类和其他在我的pom.xml:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.glassfish.jaxb</groupId>
      <artifactId>jaxb-runtime</artifactId>
    </exclusion>
  </exclusions>
</dependency>

这是我的工作!

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

相关内容

  • 没有找到相关文章

最新更新