Sto cercando un metodo semplice per convertire tra java.util.Date e javax.xml.datatype.XMLGregorianCalendar in entrambe le direzioni.
Ecco il codice che sto usando ora :
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
/**
* Utility class for converting between XMLGregorianCalendar and java.util.Date
*/
public class XMLGregorianCalendarConverter {
/**
* Needed to create XMLGregorianCalendar instances
*/
private static DatatypeFactory df = null;
static {
try {
df = DatatypeFactory.newInstance();
} catch (DatatypeConfigurationException dce) {
throw new IllegalStateException(
"Exception while obtaining DatatypeFactory instance", dce);
}
}
/**
* Converts a java.util.Date into an instance of XMLGregorianCalendar
*
* @param date Instance of java.util.Date or a null reference
* @return XMLGregorianCalendar instance whose value is based upon the
* value in the date parameter. If the date parameter is null then
* this method will simply return null.
*/
public static XMLGregorianCalendar asXMLGregorianCalendar(java.util.Date date) {
if (date == null) {
return null;
} else {
GregorianCalendar gc = new GregorianCalendar();
gc.setTimeInMillis(date.getTime());
return df.newXMLGregorianCalendar(gc);
}
}
/**
* Converts an XMLGregorianCalendar to an instance of java.util.Date
*
* @param xgc Instance of XMLGregorianCalendar or a null reference
* @return java.util.Date instance whose value is based upon the
* value in the xgc parameter. If the xgc parameter is null then
* this method will simply return null.
*/
public static java.util.Date asDate(XMLGregorianCalendar xgc) {
if (xgc == null) {
return null;
} else {
return xgc.toGregorianCalendar().getTime();
}
}
}
C'è qualcosa di più semplice, come alcune chiamate API che ho trascurato?
La conversione tra una data / ora XML standard e un oggetto data Java sembra un'attività piuttosto di routine e sono sorpreso di dover scrivere questo codice.
Eventuali suggerimenti?
NOTE: le mie classi JAXB vengono generate automaticamente da uno schema. Il processo di compilazione del mio progetto non mi consente di apportare modifiche manuali alle classi generate. Gli elementi xs: dateTime vengono generati da XJC come XMLGregorianCalendar nelle classi JAXB. Lo schema viene esteso e ottimizzato periodicamente, quindi posso apportare modifiche limitate al file XSD dello schema.
AGGIORNAMENTO SULLA SOLUZIONE: La soluzione proposta da Blaise mi ha permesso di togliere XMLGregorianCalendar dal mix e di trattare invece gli oggetti java.util.Calendar. Aggiungendo una clausola di associazione JAXB all'inizio del file dello schema, XJC è in grado di generare mappature più appropriate per xs: dateTime nelle mie classi JAXB. Ecco alcuni frammenti che mostrano le modifiche nel mio file XSD.
L'elemento radice nel file XSD:
<xs:schema xmlns:mydata="http://my.example.com/mydata" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" targetNamespace="http://my.example.com/mydata" elementFormDefault="unqualified" attributeFormDefault="unqualified" version="0.2" xml:lang="en" jaxb:version="2.0">
Blocco di annotazione vincolante JAXB, inserito immediatamente dopo l'elemento radice in XSD:
<xs:annotation>
<xs:appinfo>
<jaxb:globalBindings>
<jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
</jaxb:globalBindings>
</xs:appinfo>
</xs:annotation>
Poiché il campo XML xs: dateTime memorizza anche il fuso orario, potrebbe essere meglio per me lavorare comunque con Calendar anziché con Date poiché gli oggetti Calendar hanno un'API piuttosto buona per lavorare con le impostazioni locali e i fusi orari. In ogni caso, sono molto più felice di occuparmi di oggetti Calendar invece di XMLGregorianCalendar. Non sono più necessari i metodi di conversione che ho elencato sopra. Non sono arrivato fino a java.util.Date, ma abbastanza vicino!
util
pacchetto e usalo.