2011-01-12 4 views
4

Ich möchte "javax.xml.datatype.XMLGregorianCalendar" in "java.util.Date" ändern, wenn ich von XML auf Java-Klasse von JAXB unmarshalling.In JAXB, wie @XmlJavaTypeAdapters Annotation zu verwenden?

Aber ich gebe keine Anmerkungen von @XmlJavaTypeAdapter in Java-Klassen. So

, ich werde versuchen, eine Anmerkung von @XmlJavaTypeAdapters zu verwenden, aber ich weiß nicht, wie es zu benutzen ...

Bitte zeigen Sie mir Beispiele dafür verwenden.

+1

Verwenden Sie Code, der aus einem Schema oder handgeschriebenen JAXB-Bindungen generiert wird? – skaffman

+0

Vielen Dank für Ihre Antwort, Skaffman. Ich habe es handgeschrieben gemacht, und das Schema wird aus JavaBeans ohne Annotationen für die Ant-Aufgabe erstellt. – Take

Antwort

8

Als interessante beiseite, Sie müssen nicht tatsächlich XMLGregorianCalendar dem aktuellen Stand anzupassen, da JAXB java.util.Date nativ unterstützt - wie folgt aus:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement 
public class Example { 
    @XmlSchemaType(name = "date") 
    public Date publishingDate; 
} 

Wenn Sie es benötigen, können @XmlJavaTypeAdapter arbeiten wie diese, vorausgesetzt, Ihre eigene Klasse:

public class SillyDate { 
    public SillyDate(int year, int month, int day) { 
     super(); 
     this.year = year; 
     this.month = month; 
     this.day = day; 
    } 

    public String toString() { 
     return "SillyDate [year=" + year + ", month=" + month + ", day=" + day + "]"; 
    } 

    public int year; 
    public int month; 
    public int day; 
} 

Sie müssen eine Klasse, die JAXB verstehen, und dann einen Adapter zwischen dieser Klasse und der benutzerdefinierten Klasse schreiben, wie folgt aus:

public class SillyDateAdapter extends XmlAdapter<XMLGregorianCalendar, SillyDate> { 
    public SillyDate unmarshal(XMLGregorianCalendar val) throws Exception { 
     return new SillyDate(val.getYear(), val.getMonth(), val.getDay()); 
    } 

    public XMLGregorianCalendar marshal(SillyDate val) throws Exception { 
     return DatatypeFactory.newInstance().newXMLGregorianCalendarDate(val.year, val.month, val.day, 0); 
    } 
} 

Jetzt können Sie das in Ihren eigenen Klassen verwenden, wie folgt aus:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement 
public class Example2 { 
    @XmlSchemaType(name = "date") 
    @XmlJavaTypeAdapter(type=XMLGregorianCalendar.class,value =SillyDateAdapter.class) 
    public SillyDate publishingDate; 
} 

Es gibt viele gute Beispiele für die @XmlJavaTypeAdapter auf dem Netz verwendet wird, wie this one und this one, und einige andere. Glückliche Anpassung!

+0

Danke JesperSM! Ich werde die Annotation @XmlJavaTypeAdapter in package-info.java verwenden. Aber als nächstes weiß ich nicht, wie man package-info.java in Java benutzt. Ich verwende Ant-Task zum Kompilieren von Java-Klassen, ist das Paket-info.java ausgeschlossen? – Take

+1

Sie legen einfach eine Datei namens package-info.java in das Paket, und es wird abgeholt. Zum Vergleich führen Sie ein einfaches Schema durch 'xjc' aus und sehen Sie, was es erzeugt. Wenn Sie mit der Antwort zufrieden sind, vergessen Sie nicht, sie als akzeptiert zu markieren. – JesperSM

+0

Überprüfen Sie meine Antwort auf eine andere Frage für ein Beispiel mit package-info.java: http://stackoverflow.com/questions/4687188/how-to-convert-dateactionscript-3-to-java-util-date-through- a-xml/4694496 # 4694496 –