2009-11-11 10 views
6

Ich habe eine JAXB Klasse wie folgt:Wie kann ich eine JAXB-Eigenschaft annotieren, um xsd: time anstelle von xsd: datetime zu verwenden?

public class Game { 
    private Date startTime; 

    @XmlElement 
    public Date getStartTime() { 
     return startTime; 
    } 

    public void setStartTime(Date startTime) { 
     this.startTime = startTime; 
    } 
} 

, die in einem .xsd führt, wo Startzeit geben xsd:datetime hat. Ich möchte, dass es xsd:time ist. xsd:time Karten zu XmlGregorianCalendar, aber die umgekehrte Zuordnung Karten zu xsd:anySimpleType, die nicht sehr hilfreich ist.

Ich habe verschiedene Argumente zu @XmlElement(type=...) vergeblich versucht. Alle Hinweise würden sehr geschätzt werden.

Wenn es einen Unterschied macht, ist dies ein Typ, der von JAX-WS verwendet wird.

+0

Ich bin mir nicht klar, ob Sie versuchen, Java von XSD zu erzeugen oder erzeugen XSD von Java? – skaffman

+0

@skaffman: xsd aus java – Draemon

+0

Wenn Sie 'startTime' als' Date' Typ behalten wollen, schauen Sie sich diesen [post] (http://stackoverflow.com/questions/2519432/jaxb-unmarshal-timestamp) an. Es definiert eine Zuordnung zwischen 'Date' und' String', die verwendet wird, um den tatsächlichen 'Date'-Typ zu serialisieren. – kon

Antwort

6

Wenn Sie generieren das Schema aus den Java-Klassen hier ist, was sollte man ändern:

public class Game { 
    private XMLGregorianCalendar startTime; 

    @XmlElement 
    @XmlSchemaType(name = "time") 
    public XMLGregorianCalendar getStartTimeForSchema() { 
     return startTime; 
    } 

    public void setStartTimeForSchema(XMLGregorianCalendar startTime) { 
     this.startTime = startTime; 
    } 

    @XmlTransient 
    public Date getStartTime() { 
     return startTime.toGregorianCalendar().getTime(); 
    } 

    @XmlTransient 
    public void setStartTime(Date startTime) { 
    GregorianCalendar gc = (GregorianCalendar) GregorianCalendar.getInstance(); 
     gc.setTime(startTime); 
     DatatypeFactory dataTypeFactory = null; 
     try { 
     dataTypeFactory = DatatypeFactory.newInstance(); 
     } catch (DatatypeConfigurationException ex) { 
     // log 
     } 
     this.startTime = dataTypeFactory.newXMLGregorianCalendar(gc); 
    } 
} 
+0

Sieht gut aus. Ich habe XmlSchemaType vollständig vermisst (vielleicht, weil es in den jax-ws-Dokumenten zu Anmerkungen nicht erwähnt wird: https://jax-ws.dev.java.net/jax-ws-ea3/docs/annotations.html Nur meine Problem ist jetzt, ein 'Date' zu ​​einem' XMLGregorianCalendar' zu konvertieren - nicht so einfach, wenn man bedenkt, wie krankhaft die Java Datumsverarbeitung ist. – Draemon

+0

Ich habe meine Antwort korrigiert –

+0

Vielen Dank für Ihre Hilfe Dies wäre besser für die erste Zeile of setStartTime(): Kalender gc = GregorianCalendar.getInstance(); – Draemon

Verwandte Themen