我有以下JAXB对象:
@XmlRootElement(name = "AuthEntry")
@XmlAccessorType(XmlAccessType.FIELD)
public class AuthEntry {
@XmlElement(name = "Account")
private Account account;
@XmlElement(name = "Key", required = true)
private String key;
@XmlElement(name = "Expire", required = true)
private Date expire;
// Getter & Setter
// ...
我使用JAXB Marshaller
将对象转换为XML:
public static <T> String marshalObject(T pObject) throws JAXBException, IOException {
JAXBContext context = JAXBContext.newInstance(pObject.getClass());
Marshaller m = context.createMarshaller();
try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) {
m.marshal(pObject, stream);
stream.flush();
return new String(stream.toByteArray());
}
}
它顺利运行,没有任何异常,但结果始终缺少元素Key
。我尝试将其更改为属性,但它也不起作用。以下是输出示例:
<AuthEntry xmlns:ns2="urn:schemas-microsoft-com:sql:SqlRowSet3">
<Account ID="1" Username="datvm" Password="datvm" FullName="NullPtrExc" Active="true"/>
<Expire>2014-06-06T20:07:32.428+07:00</Expire>
</AuthEntry>
我尝试将Key
名称更改为其他名称,例如AuthKey
,但它仍然缺失。我做错了什么?
编辑我发现了问题,原因是我的Key
值为null
。如果它包含值,则将其写入XML。但是,你可以解释为什么在XMLElement中,我写了required = true
,但是当它为null时它仍然缺失?
答案 0 :(得分:2)
JAXB忽略required
属性,请参阅this question and answer。
但是,如果使用schemagen
从类创建XSD架构,则会遵循注释的required
属性,并且根据架构将需要XML元素。
答案 1 :(得分:2)
null
默认情况下,JAXB实现不会封送null
值的属性或元素。您可以使用以下命令让JAXB生成包含xsi:nil="true"
属性的元素:
@XmlElement(nillable=true)
空元素不是null的有效表示。例如,如果您的元素类型为xs:dateTime
且相应的元素为空,则该文档将不会针对XML架构进行验证。