2009-11-11 15 views
6

Ho una classe JAXB come questo:Come annotare una proprietà JAXB per utilizzare xsd: time anziché xsd: datetime?

public class Game { 
    private Date startTime; 

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

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

che si traduce in un .xsd dove startTime è di tipo xsd:datetime. Voglio che sia xsd:time. xsd:time mappe a XmlGregorianCalendar, ma la mappatura inversa viene mappata a xsd:anySimpleType che non è molto utile.

Ho provato vari argomenti a @XmlElement(type=...) inutilmente. Qualsiasi suggerimento sarebbe molto apprezzato.

Se fa la differenza, questo è un tipo usato da JAX-WS.

+0

Io non sono chiare se si sta cercando di generare Java da XSD, o generare XSD da Java? – skaffman

+0

@skaffman: xsd da java – Draemon

+0

Se si desidera mantenere 'startTime' come tipo' Date', dare un'occhiata a questo [post] (http://stackoverflow.com/questions/2519432/jaxb-unmarshal-timestamp). Definisce una mappatura tra 'Date' e' String', che è usata per serializzare il tipo di 'Date'. – kon

risposta

6

Se si sta generando lo schema delle classi Java Ecco che cosa si dovrebbe cambiare:

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

Bello. Mi mancava completamente XmlSchemaType (forse dal momento che non è menzionato nei documenti jax-ws sulle annotazioni: https://jax-ws.dev.java.net/jax-ws-ea3/docs/annotations.html Il mio unico il problema ora è di convertire un 'Date' in un' XMLGregorianCalendar' - non così facile considerando quanto patologicamente insano il trattamento Data di Java è – Draemon

+0

Ho risolto la mia risposta –

+0

Grazie per tutto il vostro aiuto Questo sarebbe meglio per la prima linea di setStartTime(): Calendar gc = GregorianCalendar.getInstance(); – Draemon

Problemi correlati