我有以下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
。我尝试将其改为Attribute,但也不起作用。下面是一个示例输出:
<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
,但它仍然缺失。我做错了什么?
EDIT我发现了问题,是因为我的Key
值是null
,如果它包含value,那么它就被写入XML。但是,你能解释一下为什么在XMLElement中,我写了required = true
,但是当它为null时,它仍然缺失吗?
3条答案
按热度按时间rqdpfwrv1#
JAXB语言
默认情况下,JAXB实现不会封送
null
值的属性或元素。可以使用以下命令使JAXB生成包含xsi:nil="true"
属性的元素:空元素
空元素不是null的有效表示形式。例如,如果元素的类型为
xs:dateTime
,而对应的元素为空,则不会根据XML架构验证该文档。i5desfxk2#
JAXB忽略
required
属性,请参见this question and answer。但是,如果使用
schemagen
从类创建XSD架构,则注解的required
属性将被接受,并且根据架构需要XML元素。o4hqfura3#
我遇到了同样的问题,在封送时字段丢失。字段不是
null
(最初)。调试时,我在
jaxbContext.typeMap.myFieldParrentClass.value.properties.singleElementLeafPropertyForMyField.hiddenByOverride = true
中发现了这一点。我有父类和子类。字段在父类和子类中,父类的正确值将被子类字段的
null
覆盖。