Java JAXB空元素解组
问题在于: 我得到了包含空元素的soap响应(例如,Java JAXB空元素解组,java,xml,exception,jaxb,Java,Xml,Exception,Jaxb,问题在于: 我得到了包含空元素的soap响应(例如,…) 因此,当JAXB想要解析这个元素时,就会抛出异常 而是使用null值设置适当的字段 如何配置JAXB以将空元素视为null? 我们是否可以仅使用JAXB(不使用某些第三方解决方法)来实现这一点 空字符串不是xsd:date类型的有效值。要对XML架构有效,可选元素应表示为不存在的节点 为什么基本问题会影响你 所有JAXB实现都将认识到空的String不是xsd:date的有效值。他们通过将其报告给ValidationEventHandl
…
)
因此,当JAXB想要解析这个元素时,就会抛出异常
而是使用null
值设置适当的字段
如何配置JAXB以将空元素视为null?
我们是否可以仅使用JAXB(不使用某些第三方解决方法)来实现这一点
空字符串
不是xsd:date
类型的有效值。要对XML架构有效,可选元素应表示为不存在的节点
为什么基本问题会影响你 所有JAXB实现都将认识到空的
String
不是xsd:date
的有效值。他们通过将其报告给ValidationEventHandler
的实例来实现这一点。通过执行以下操作,您可以自己看到这一点:
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setEventHandler(new ValidationEventHandler() {
@Override
public boolean handleEvent(ValidationEvent event) {
System.out.println(event);
return true;
}
});
您正在使用的JAX-WS的实现利用了JAXB提供程序。在您正在使用的版本中,当遇到严重程度为错误的ValidationEvent
时,默认情况下,MOXy将引发异常,而不是像参考实现那样的致命错误。这已在以下错误中修复:
变通
如果您直接使用JAXB API,只需覆盖默认的ValidationEventHandler
。在JAX-WS环境中,可以使用XmlAdapter
来提供自定义转换逻辑。我们将利用XmlAdapter
来覆盖如何处理与Date
之间的转换
XmlAdapter(日期适配器)
演示代码
下面是一个独立的示例,您可以运行它来查看一切是否正常
jaxb.properties
在一个独立的示例中,要使用MOXy作为JAXB提供程序,您需要在与域模型相同的包中包含一个名为JAXB.properties
的文件,其中包含以下条目(请参阅:)
input.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<abc></abc>
<qwe>2013-09-05</qwe>
</root>
输出
请注意,在封送的XML中,null的Date
字段被封送为缺少的元素(请参阅:)
2013-09-05
您能分享更多信息吗?异常堆栈跟踪和一些代码可能?
import java.util.Date;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlSchemaType(name = "date")
@XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class)
private Date abc;
@XmlSchemaType(name="date")
@XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class)
private Date qwe;
}
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
<?xml version="1.0" encoding="UTF-8"?>
<root>
<abc></abc>
<qwe>2013-09-05</qwe>
</root>
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum18617998/input.xml");
Root root = (Root) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<root>
<qwe>2013-09-05</qwe>
</root>