Ich suche nach einer einfachen Methode zum Konvertieren zwischen java.util.Date und javax.xml.datatype.XMLGregorianCalendar in beide Richtungen.
Hier ist der Code, den ich jetzt verwende :
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();
}
}
}
Gibt es etwas Einfacheres, wie einen API-Aufruf, den ich übersehen habe?
Das Konvertieren zwischen einem Standard-XML-Datums- / Uhrzeit- und einem Java-Datumsobjekt scheint eine ziemlich routinemäßige Aufgabe zu sein, und ich bin überrascht, dass ich diesen Code überhaupt schreiben muss.
Irgendwelche Vorschläge?
HINWEISE: Meine JAXB-Klassen werden automatisch aus einem Schema generiert. Der Erstellungsprozess in meinem Projekt ermöglicht es mir nicht, manuelle Änderungen an den generierten Klassen vorzunehmen. Die xs: dateTime-Elemente werden von XJC als XMLGregorianCalendar in den JAXB-Klassen generiert. Das Schema wird regelmäßig erweitert und optimiert, sodass ich nur begrenzte Änderungen an der XSD-Schemadatei vornehmen darf.
UPDATE ON SOLUTION: Die von Blaise vorgeschlagene Lösung hat es mir ermöglicht, XMLGregorianCalendar aus dem Mix zu nehmen und stattdessen mit java.util.Calendar-Objekten umzugehen. Durch Hinzufügen einer JAXB-Bindungsklausel oben in meiner Schemadatei kann XJC in meinen JAXB-Klassen geeignetere Zuordnungen für xs: dateTime generieren. Hier sind einige Ausschnitte, die die Änderungen in meiner XSD-Datei zeigen.
Das Stammelement in der XSD-Datei:
<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-Bindungsanmerkungsblock, der unmittelbar nach dem Stammelement in XSD eingefügt wird:
<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>
Da im XML xs: dateTime-Feld auch die Zeitzone gespeichert ist, ist es für mich möglicherweise besser, mit Kalender anstelle von Datum zu arbeiten, da Kalenderobjekte eine ziemlich gute API für die Arbeit mit Gebietsschemas und Zeitzonen haben. Auf jeden Fall bin ich viel glücklicher mit Kalenderobjekten als mit XMLGregorianCalendar umzugehen. Die oben aufgeführten Konvertierungsmethoden sind nicht mehr erforderlich. Ich bin nicht bis zu java.util.Date gekommen, aber nah genug!
util
Packung und benutze es.Antworten:
Warum nicht eine externe Bindungsdatei verwenden, um XJC anzuweisen, java.util.Date-Felder anstelle von XMLGregorianCalendar zu generieren?
Siehe auch Wie ordne ich xs: date java.util.Date zu? Blog
quelle
Von XMLGregorianCalendar bis java.util.Date können Sie einfach Folgendes tun:
quelle
Von java.util.Date bis XMLGregorianCalendar können Sie einfach Folgendes tun:
Code bearbeitet nach dem ersten Kommentar von @ f-puras, weil ich einen Fehler mache.
quelle
Ich musste einige Änderungen vornehmen, damit es funktioniert, da sich einige Dinge in der Zwischenzeit geändert zu haben scheinen:
Hier ist ein funktionierendes Beispiel, hoffe, dies hilft (ich verwende JodaTime, aber in diesem Fall würde SimpleDate ausreichen):
In der xsd habe ich die oben angegebenen hervorragenden Referenzen befolgt, daher habe ich diese xml-Anmerkung eingefügt:
quelle
Ich hatte auch solche Kopfschmerzen. Ich habe es beseitigt, indem ich einfach Zeitfelder in meinem POJO als primitiv lange dargestellt habe. Jetzt behandelt die Generierung meines WS-Client-Codes alles korrekt und kein XML-zu-Java-Mist mehr. Und natürlich ist der Umgang mit Millis auf der Java-Seite einfach und schmerzlos. KISS Prinzip rockt!
quelle
Mit dieser Anpassung können Sie die Standardzuordnung in java.util.Date ändern
quelle
Anpassen von Kalender und Datum beim Marshalling
Schritt 1: Bereiten Sie die Jaxb-Bindungs-XML für benutzerdefinierte Eigenschaften vor. In diesem Fall habe ich mich auf Datum und Kalender vorbereitet
Setp 2: Fügen Sie Apache oder verwandten Plugins mit der Option xsd eine benutzerdefinierte Jaxb-Bindungsdatei hinzu, wie unten erwähnt
Setp 3: Schreiben Sie den Code für die CalendarConverter-Klasse
Setp 4: Ausgabe
quelle