Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I annotate a JAXB property to use xsd:time rather than xsd:datetime?

I have a JAXB class like this:

public class Game {
    private Date startTime;

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

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

which results in an .xsd where startTime has type xsd:datetime. I want it to be xsd:time. xsd:time maps to XmlGregorianCalendar, but the reverse mapping maps to xsd:anySimpleType which isn't very helpful.

I've tried various arguments to @XmlElement(type=...) to no avail. Any pointers would be greatly appreciated.

If it makes a difference, this is a type used by JAX-WS.

like image 506
Draemon Avatar asked Nov 11 '09 11:11

Draemon


1 Answers

If you are generating the schema from the Java classes here is what you should change:

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);
    }
}
like image 128
David Rabinowitz Avatar answered Oct 20 '22 13:10

David Rabinowitz