java JAXB封送缺少属性/元素

4si2a6ki  于 2023-02-07  发布在  Java
关注(0)|答案(3)|浏览(136)

我有以下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时,它仍然缺失吗?

rqdpfwrv

rqdpfwrv1#

JAXB语言

默认情况下,JAXB实现不会封送null值的属性或元素。可以使用以下命令使JAXB生成包含xsi:nil="true"属性的元素:

@XmlElement(nillable=true)

空元素

空元素不是null的有效表示形式。例如,如果元素的类型为xs:dateTime,而对应的元素为空,则不会根据XML架构验证该文档。

i5desfxk

i5desfxk2#

JAXB忽略required属性,请参见this question and answer
但是,如果使用schemagen从类创建XSD架构,则注解的required属性将被接受,并且根据架构需要XML元素。

o4hqfura

o4hqfura3#

我遇到了同样的问题,在封送时字段丢失。字段不是null(最初)。
调试时,我在jaxbContext.typeMap.myFieldParrentClass.value.properties.singleElementLeafPropertyForMyField.hiddenByOverride = true中发现了这一点。
我有父类和子类。字段在父类和子类中,父类的正确值将被子类字段的null覆盖。

相关问题