2009-11-11 9 views
6

tengo una clase JAXB como esto:¿Cómo anoto una propiedad JAXB para usar xsd: time en vez de xsd: datetime?

public class Game { 
    private Date startTime; 

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

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

lo que se traduce en una .xsd donde horaInicio tiene el tipo xsd:datetime. Quiero que sea xsd:time. xsd:time se mapea a XmlGregorianCalendar, pero el mapeo inverso se mapea a xsd:anySimpleType que no es muy útil.

He intentado varios argumentos para @XmlElement(type=...) en vano. Cualquier puntero sería muy apreciado.

Si hace una diferencia, este es un tipo utilizado por JAX-WS.

+0

No me queda claro si está tratando de generar Java desde XSD o generar XSD de java? – skaffman

+0

@skaffman: xsd de java – Draemon

+0

Si desea mantener 'startTime' como' Date' type, eche un vistazo a esta [publicación] (http://stackoverflow.com/questions/2519432/jaxb-unmarshal-timestamp). Define una asignación entre 'Fecha' y' Cadena', que se utiliza para serializar el tipo 'Fecha' real. – kon

Respuesta

6

Si va a generar el esquema de las clases de Java aquí es lo que debe cambiar:

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

Luce bien. Había perdido completamente XmlSchemaType (quizás porque no se menciona en los documentos jax-ws en las anotaciones: https://jax-ws.dev.java.net/jax-ws-ea3/docs/annotations.html Mi único el problema ahora es convertir una 'Fecha' en' XMLGregorianCalendar', no tan fácil teniendo en cuenta lo patológicamente loco que es el manejo de la Fecha de Java. – Draemon

+0

He solucionado mi respuesta –

+0

Gracias por toda su ayuda Esto sería mejor para la primera línea de setStartTime(): Calendar gc = GregorianCalendar.getInstance(); – Draemon