Обработка нуля в сериализации Java xml - PullRequest
4 голосов
/ 15 декабря 2010

Я использую JAXB2 для сериализации объекта в XML.

Есть ли способ заставить его создать всю структуру объекта, как в следующем примере, даже если он не заполнен вспомогательным объектом?

Это мой предполагаемый результат, даже если не установлено свойство asignee.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<note>
    <to xsi:nil="true"/>
    <from xsi:nil="true"/>
    <header xsi:nil="true"/>
    <body>text</body>
    <assignee>
        <name xsi:nil="true"/>
        <surname xsi:nil="true"/>
    </assignee>
</note>

Я использую следующий код для сериализации:

JAXBContext jc = JAXBContext.newInstance(dataObject.getClass());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocation);
marshaller.setProperty(Marshaller.JAXB_ENCODING, charset);
marshaller.marshal(dataObject, outputStream);

Ответы [ 2 ]

3 голосов
/ 16 декабря 2010

Вы можете сделать следующее:

Примечание

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement
@XmlType(propOrder={"to", "from", "header", "body", "assignee"})
public class Note {

    private String to;
    private String from;
    private String header;
    private String body;
    private Assignee assignee;

    @XmlElement(nillable=true)
    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    @XmlElement(nillable=true)
    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    @XmlElement(nillable=true)
    public String getHeader() {
        return header;
    }

    public void setHeader(String header) {
        this.header = header;
    }

    @XmlElement(nillable=true)
    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public Assignee getAssignee() {
        return assignee;
    }

    public void setAssignee(Assignee assignee) {
        this.assignee = assignee;
    }

}

Цессионарий

Нам понадобитсяозначает «нет», когда недопустимый экземпляр Assignee следует интерпретировать как нулевой.Я добавил метод isNull (), который возвращает true, если все поля являются нулевыми.

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlJavaTypeAdapter(AssigneeAdapter.class)
public class Assignee {

    private String name;
    private String surname;

    @XmlElement(nillable=true)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElement(nillable=true)
    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public boolean isNull() {
        return null == name && null == surname;

    }
}

AssigneeAdapter

AssigneeAdapter использует оба объекта Assignee для значениятип и связанный тип.Этот класс использует метод isNull (), который мы добавили в Assignee:

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class AssigneeAdapter extends XmlAdapter<Assignee, Assignee> {

    @Override
    public Assignee unmarshal(Assignee v) throws Exception {
        if(v.isNull()) {
            return null;
        }
        return v;
    }

    @Override
    public Assignee marshal(Assignee v) throws Exception {
        if(null == v) {
            return new Assignee();
        }
        return v;
    }

}

Demo

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Note.class);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(new Note(), System.out);
    }
}

Для получения дополнительной информации о XmlAdapter см .:

0 голосов
/ 15 декабря 2010

Да.Используйте комбинацию @XmlElementRef и JAXBElement с nil, установленным в true.

См .:

...