22

我已经从 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();
}

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

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 编译器配置中使用认可的文件夹,但它仍然会发生

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

感谢你

4

8 回答 8

38

用下面的代码解决

@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
于 2013-03-23T03:47:36.457 回答
5

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

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

于 2014-11-25T04:19:46.343 回答
1

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

于 2013-08-15T12:32:54.997 回答
1

在 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>
于 2016-12-22T14:41:11.003 回答
1

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

于 2017-07-19T08:34:51.457 回答
0

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

就我而言,一个类缺少@XmlAccessorType,添加此注释解决了我的问题。根据您的情况,解决方案是:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

@XmlAccessorType(XmlAccessType.FIELD) // check, if @XmlAccessorType is missing
public class GetClientByAccountResponse {
  ..
于 2018-05-10T12:39:48.950 回答
0

就我而言,问题在于我的应用程序使用了 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>

这对我有用!

于 2021-03-10T09:20:17.417 回答
-3

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

于 2015-01-09T18:48:38.293 回答