2010-12-15 67 views
4

J'utilise JAXB2 pour sérialiser un objet en XML.Prise en charge de la sérialisation Java xml

Existe-t-il un moyen de forcer la création d'une structure d'objet entière comme dans l'exemple suivant même si elle n'est pas remplie dans l'objet de support?

Ceci est mon résultat escompté même si la propriété de la propriété n'a pas été définie.

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

J'utilise le code suivant pour la sérialisation:

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

Répondre

3

Vous pouvez effectuer les opérations suivantes:

Remarque

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

} 

Assigné

Nous aurons besoin d'avoir un moyen de non quand une instance de unmarshalled Cessionnaire doit être interprété comme nulle. J'ai ajouté une méthode isNull() qui renvoie true si tous les champs sont null.

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

Le AssigneeAdapter utilise à la fois l'objet Cessionnaire pour le type de valeur et le type lié. Cette classe met à profit la méthode isNull() nous avons ajouté le Cessionnaire:

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

} 

Démo

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

Pour plus d'informations sur XMLAdapter voir

+0

Merci beaucoup! On dirait que @XmlJavaTypeAdapter a fait ma journée. –

0
+0

JAXBElement est utile lorsque vous devez distinguer pourquoi votre valeur est nulle (élément manquant ou élément présent avec xsi: nil = "true"). Si vous voulez toujours représenter null avec xsi: nil = "true", alors vous pouvez simplement utiliser @XmlElement (nillable = true). Consultez ma réponse: http://stackoverflow.com/questions/4449284/java-xml-serialization-null-handling/4455014#4455014 –