2009-11-11 4 views
6

J'ai une classe JAXB comme ceci:Comment annoter une propriété JAXB pour utiliser xsd: time plutôt que xsd: datetime?

public class Game { 
    private Date startTime; 

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

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

qui se traduit par un .xsd où startTime est de type xsd:datetime. Je veux que ce soit xsd:time. xsd:time correspond à XmlGregorianCalendar, mais la correspondance inverse correspond à xsd:anySimpleType ce qui n'est pas très utile.

J'ai essayé divers arguments à @XmlElement(type=...) en vain. Tout pointeur serait grandement apprécié.

Si cela fait une différence, c'est un type utilisé par JAX-WS.

+0

Je ne suis pas clair si vous essayez de générer Java à partir XSD, ou de générer XSD de java? – skaffman

+0

@skaffman: xsd from java – Draemon

+0

Si vous voulez garder 'startTime' comme type' Date', jetez un oeil à ce [post] (http://stackoverflow.com/questions/2519432/jaxb-unmarshal-timestamp). Il définit un mappage entre 'Date' et' String', utilisé pour sérialiser le type 'Date' réel. – kon

Répondre

6

Si vous générez le schéma des classes Java Voici ce que vous devez changer:

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

Vous cherchez bien. J'ai complètement manqué XmlSchemaType (peut-être parce que ce n'est pas mentionné dans les docs de jax-ws sur les annotations: https://jax-ws.dev.java.net/jax-ws-ea3/docs/annotations.html Mon seul le problème est maintenant de convertir un 'Date' à un' XMLGregorianCalendar' - pas si facile compte tenu de la façon dont la manipulation de Date de Java pathologiquement fous – Draemon

+0

J'ai corrigé ma réponse –

+0

Merci pour toute votre aide Ce serait mieux pour la première ligne de setStartTime(): Calendrier gc = GregorianCalendar.getInstance(); – Draemon