2012-04-13 4 views
3

Stellen ich Enum wie folgt definiert haben:Kann JAXB/MOXy Enums auf dieselbe Weise serialisieren wie normale Klassen (Nicht-Enums)?

public enum ArchiveStatus implements Serializable { 
    CANDIDATE   (0, "CANDIDATE", "Candidate for archival"), 
    IN_LIBRARY   (1, "IN-LIBRARY", ".."), 
    FROM_LIBRARY  (2, "FROM-LIBRARY", ".."); 

    private int id; 
    private String shortName; 
    private String longName; 

    public ArchiveStatus(int id, String shortName, String longName) { 
    .. 
    } 

    public int getId() { .. } 
    public String getShortName() { .. } 
    public String getLongName() { .. } 
} 

standardmäßig moxy wird serialisiert es zu JSON wie folgt aus:

{ 
    .. 
    "archiveStatus": "CANDIDATE", 
    .. 
} 

Gibt es eine Möglichkeit zu konfigurieren moxy (in der Mapping-Datei) eNUM wie eine normale Klasse serialisiert werden:

{ 
    .. 
    "archiveStatus": { "id" : 0, "shortName": "CANDIDATE", "longName": "Candidate for archival" }, 
    .. 
} 
+0

Was ist der Sinn, dies zu tun? Die _only_-Information, die Sie benötigen, um ein Aufzählungselement eindeutig zu identifizieren, ist der Name. –

+0

Der einzige Grund besteht darin, die API beizubehalten, die JSON zurückgibt. Ich untersuche, ob wir mit MOXy den JSON-Serializer ersetzen können. – Waldek

Antwort

4

Hinweis: ich bin die EclipseLink JAXB (MOXy) führen und ein Mitglied der Expertengruppe JAXB 2 (JSR-222).

ArchiveStatusAdapter

Sie diese ein XmlAdapter durch den Einsatz von Anwendungsfall lösen. XmlAdapter ist ein JAXB-Mechanismus, mit dem Sie einen Objekttyp als einen anderen marshallen können.

package forum10144489; 

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

public class ArchiveStatusAdapter extends XmlAdapter<ArchiveStatusAdapter.AdaptedArchiveStatus, ArchiveStatus> { 

    public static class AdaptedArchiveStatus { 
     public int id; 
     public String shortName; 
     public String longName; 
    } 

    @Override 
    public ArchiveStatus unmarshal(AdaptedArchiveStatus adaptedArchiveStatus) throws Exception { 
     if(null == adaptedArchiveStatus) { 
      return null; 
     } 
     return ArchiveStatus.valueOf(adaptedArchiveStatus.shortName); 
    } 

    @Override 
    public AdaptedArchiveStatus marshal(ArchiveStatus archiveStatus) throws Exception { 
     if(null == archiveStatus) { 
      return null; 
     } 
     AdaptedArchiveStatus adaptedArchiveStatus = new AdaptedArchiveStatus(); 
     adaptedArchiveStatus.id = archiveStatus.getId(); 
     adaptedArchiveStatus.longName = archiveStatus.getLongName(); 
     adaptedArchiveStatus.shortName = archiveStatus.getShortName(); 
     return adaptedArchiveStatus; 
    } 

} 

Wurzel

The XmlAdapter kann unter Verwendung der Annotations @XmlJavaTypeAdapter im Feld, eine Eigenschaft, Typ oder Paketebene angegeben werden.

package forum10144489; 

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

public class Root { 

    private ArchiveStatus archiveStatus; 

    @XmlJavaTypeAdapter(ArchiveStatusAdapter.class) 
    public ArchiveStatus getArchiveStatus() { 
     return archiveStatus; 
    } 

    public void setArchiveStatus(ArchiveStatus archiveStatus) { 
     this.archiveStatus = archiveStatus; 
    } 

} 

jaxb.properties

Um moxy als JAXB-Provider geben Sie eine Datei jaxb.properties im selben Paket wie Sie Ihre Domain-Klassen mit dem folgenden Eintrag namens hinzufügen müssen.

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory 

Demo

package forum10144489; 

import java.io.StringReader; 
import java.util.*; 
import javax.xml.bind.*; 
import javax.xml.transform.stream.StreamSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(2); 
     properties.put("eclipselink.media-type", "application/json"); 
     properties.put("eclipselink.json.include-root", false); 
     JAXBContext jc = JAXBContext.newInstance(new Class[] {Root.class}, properties); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     StringReader jsonStringReader = new StringReader("{\"archiveStatus\" : {\"id\" : 0, \"shortName\" : \"CANDIDATE\", \"longName\" : \"Candidate for archival\"}}"); 
     StreamSource jsonSource = new StreamSource(jsonStringReader); 
     Root root = unmarshaller.unmarshal(jsonSource, Root.class).getValue(); 

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

} 

Ausgabe

Im Folgenden finden Sie die Ausgabe von Ausführen des Demo-Code:

{ 
    "archiveStatus" : { 
     "id" : 0, 
     "shortName" : "CANDIDATE", 
     "longName" : "Candidate for archival" 
    } 
} 

Weitere Informati auf