2010-12-15 6 views
4

Ich benutze JAXB2, um Objekt zu XML zu serialisieren.Java-XML-Serialisierung null Handhabung

Gibt es eine Möglichkeit, wie es zu erzwingen, gesamte Objektstruktur wie im folgenden Beispiel zu erstellen, auch wenn es nicht in Backing-Objekt gefüllt ist?

Dies ist mein beabsichtigtes Ergebnis, auch ohne dass die Eigenschaft asignee gesetzt ist.

<?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> 

Ich verwende folgenden Code für die Serialisierung:

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); 

Antwort

3

Sie tun können, die folgenden:

Hinweis

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; 
    } 

} 

Zessionar

Wir müssen ein Mittel müssen nicht, wenn ein entordnet Instanz Zessionar sollte als null interpretiert werden. Ich habe eine isNull() -Methode hinzugefügt, die true zurückgibt, wenn alle Felder null sind.

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 Der Wert für den Typ und die gebundenen Typ sowohl den Zessionar Objekt verwendet. Diese Klasse nutzt die isNull() Methode, die wir auf Zessionar hinzugefügt:

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); 
    } 
} 

Weitere Informationen zu XMLAdapter sehen:

+0

Vielen Dank! Sieht aus wie @XmlJavaTypeAdapter meinen Tag gemacht. –

0
+0

JAXBElement ist nützlich, wenn Sie unterscheiden müssen, warum Ihr Wert null ist (fehlendes Element oder Element vorhanden mit xsi: nil = "true"). Wenn Sie immer null mit xsi: nil = "true" darstellen möchten, können Sie einfach @XmlElement (nillable = true) verwenden. Überprüfen Sie meine Antwort: http://stackoverflow.com/questions/4449284/java-xml-serialization-null-handling/4455014#4455014 –