Szukam prostej metody konwersji między java.util.Date i javax.xml.datatype.XMLGregorianCalendar w obie strony.Prosta konwersja między java.util.Date i XMLGregorianCalendar
Oto kod, który używam teraz:
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();
}
}
}
Czy jest coś prostszego, jak niektórzy nazywają API że przeoczyliśmy?
Konwersja pomiędzy standardową datą/czasem XML a obiektem daty Java wydaje się być całkiem rutynowym zadaniem i jestem zaskoczony, że muszę napisać ten kod w ogóle.
Wszelkie sugestie?
UWAGI: Moje klasy JAXB są generowane automatycznie ze schematu. Proces kompilacji w moim projekcie nie pozwala mi ręcznie wprowadzać zmian w wygenerowanych klasach. Elementy XS: dateTime są generowane przez XJC jako XMLGregorianCalendar w klasach JAXB. Schemat jest okresowo rozszerzany i modyfikowany, więc mogę wprowadzać ograniczone zmiany do pliku XSD schematu.
UPDATE ROZWIĄZANIE: Proponowana przez Błażeja rozwiązanie pozwoliło mi podjąć XMLGregorianCalendar z mieszanki i radzić sobie z java.util.Calendar obiektów zamiast. Dodając klauzulę wiążącą JAXB u góry mojego pliku schematu, XJC jest w stanie wygenerować bardziej odpowiednie odwzorowania dla xs: dateTime w moich klasach JAXB. Oto kilka fragmentów pokazujących modyfikacje w moim pliku XSD.
elementem głównym pliku 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">
JAXB wiązania bloku adnotacji umieszczonej bezpośrednio za elementem głównym 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>
Ponieważ xs XML: pola daty również przechowuje strefę czasową, może lepiej dla mnie pracować z Kalendarzem zamiast Datą, ponieważ obiekty Kalendarza mają całkiem niezły interfejs API do pracy z ustawieniami regionalnymi i strefami czasowymi. W każdym razie cieszę się, że mogę zajmować się obiektami kalendarza zamiast XMLGregorianCalendar. Nie ma już potrzeby stosowania metod konwersji wymienionych powyżej. Nie dotarłem aż do java.util.Date, ale wystarczająco blisko!
Co na marginesie, ale dlaczego w pierwszej kolejności zajmujesz się obiektami XMLGregorianCalendar? Są trochę irytujące. Jeśli pochodzą one z jaxb, możliwe jest użycie @XMLTypeAdapter do bezpośredniego powiązania z java.util.Date. Oczywiście, jeśli generujesz autogenerację schematu, zmiana obiektów może być równie irytująca podczas regeneracji. – Affe
@Affe Generuję autogenerację schematu, więc nie mogę wprowadzić żadnych ręcznych zmian w wygenerowanych klasach JAXB. –
Czy jest to to samo, co http://stackoverflow.com/questions/835889/java-util-date-to -xmlgregoriancalendar? –