首页 > 解决方案 > 在 JAXB 中解组期间忽略未定义的元素引用

问题描述

我目前正在开发一个使用 CXF 框架请求 Web 服务的项目。

由于某些原因,我开始收到无效的 XML SOAP(缺少引用的 ID 的元素)响应,导致在解组到 POJO 实例期间引发异常。

例子:

XML 摘录,其中属性引用具有XML 中不存在的ref标识符的元素。Person1

<ext:Applicant s:ref="Person1"/>

XSD 架构中ref的类型在哪里IDREF

<attribute name="ref" type="IDREF"/>

JAXB 抛出的异常

javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: Undefined ID "Person1". ] with root cause
javax.xml.bind.UnmarshalException: Undefined ID "Person1".
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:744) ~[jaxb-impl-2.3.1.jar!/:2.3.1]
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.errorUnresolvedIDREF(UnmarshallingContext.java:795) ~[jaxb-impl-2.3.1.jar!/:2.3.1]
    at com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor$IDREFTransducedAccessorImpl$1.run(TransducedAccessor.java:330) ~[jaxb-impl-2.3.1.jar!/:2.3.1]
    at...

有没有办法让 JAXB 忽略丢失的引用并解组传入的 XML 响应而不抛出异常?

标签: javaxmljaxbcxf

解决方案


请求中未提供 XML 对象以进行更具体的讨论。有一个方便的解决方法可以CustomAdapter为 JAX-B 对象创建以确定如何创建对象marshalunmarshal对象。

例如,CustomAdapter可以实现以下内容:

public static class CustomAdapter extends XmlAdapter<Object, Person1> {

    @Override
    public Object marshal(Person1 value) {
        // your implementation to marshal
    }

    @Override
    public Person1 unmarshal(Object value) {
        // your implementation to unmarshal
    }
}

XmlAdapterjavax.xml.bind.annotation.adapters.XmlAdapter包装中。

如果您在其他对象(组合)中用作字段,则可以使用如下Person1注释:@XmlJavaTypeAdapter

  @XmlJavaTypeAdapter(CustomAdapter.class)
  private Person1 person1;

如果有帮助,请告诉我。


推荐阅读