java - 在 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 响应而不抛出异常?
解决方案
请求中未提供 XML 对象以进行更具体的讨论。有一个方便的解决方法可以CustomAdapter
为 JAX-B 对象创建以确定如何创建对象marshal
和unmarshal
对象。
例如,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
}
}
XmlAdapter
在javax.xml.bind.annotation.adapters.XmlAdapter
包装中。
如果您在其他对象(组合)中用作字段,则可以使用如下Person1
注释:@XmlJavaTypeAdapter
@XmlJavaTypeAdapter(CustomAdapter.class)
private Person1 person1;
如果有帮助,请告诉我。
推荐阅读
- android - DialogFragment 阻止上一个片段上的动画
- node.js - Nodejs moment not able to convert string to date
- mongodb - Mongodb聚合查找以在每个数组中添加带有条件的字段
- javascript - TypeError:无法在 Array.forEach 处读取未定义的属性“名称”
- list - 如何从 firestore 检查有多少项目具有真值或假值并在列表中仅显示真值?- 颤动
- ios - JSON 写入中的类型无效 (RTCIceCandidate)
- reactjs - react并发模式的使用方法
- typescript - 打字稿中可选函数参数下的解构参数抛出错误
- c# - 为绕过令牌触发 hCaptcha 回调函数
- hbase - MAPR 性能属性在集群中对大量数据没有贡献