调用Web服务时,我得到XML格式的动态响应。
所以回应可能是:
<response>
<test1>test1</test1>
<test2>test1</test2>
<test3>test1</test3>
<test4>test1</test4>
</response>
或:
<response>
<test1>test1</test1>
<test2>test1</test2>
</response>
但我认为响应应该是静态的,以便从XML中正确地解组Java类。
所以而不是
<response>
<test1>test1</test1>
<test2>test1</test2>
</response>
这应该是:
<response>
<test1>test1</test1>
<test2>test1</test2>
<test3></test3>
<test4></test4>
</response>
这意味着我现在可以处理响应并检查缺失的数据。
我的想法是否正确?
答案 0 :(得分:1)
默认情况下,JAXB(JSR-222)实现会将属性视为可选元素。因此,空值表示为文档中不存在的元素。
或者,通过在其上包含xsi:nil="true"
属性来表示null。这是通过使用@XmlElement(nillable=true)
注释您的媒体资源来实现的。
<date xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
空元素不是null的有效表示。它将被视为一个空字符串,对所有非String类型都是无效的。
<date/>
SO test1 test1是 一个有效的回应,但字段test3&amp; test4将设置为null?
对于与缺席节点相对应的字段/属性,没有做任何事情。它们将保留默认值,默认情况下初始化为null
。
Java模型(根)
在下面的模型类中,我已经草拟了字段,使其值不是null
。
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Root {
@XmlElement
String foo = "Hello";
String bar = "World";
public String getBar() {
return bar;
}
public void setBar(String bar) {
this.bar = bar;
}
}
<强>演示强>
正在编组的文档<root/>
没有与模型类中映射的字段/属性对应的任何元素。
import java.io.StringReader;
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();
StringReader xml = new StringReader("<root/>");
Root root = (Root) unmarshaller.unmarshal(xml);
System.out.println(root.foo);
System.out.println(root.bar);
}
}
<强>输出强>
我们看到输出的默认值。这表明没有对缺席节点执行设置操作。
Hello
World
答案 1 :(得分:0)
参考JAXB Marshalling with null fields 还有What's the purpose of minOccurs, nillable and restriction?
使用@XmlElement(nillable = true)
显示那些空/空值字段;但请特别注意 日期 字段。