Saya mencari metode sederhana untuk mengubah antara java.util.Date dan javax.xml.datatype.XMLGregorianCalendar di kedua arah.
Ini kode yang saya gunakan sekarang :
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();
}
}
}
Apakah ada yang lebih sederhana, seperti beberapa panggilan API yang telah saya abaikan?
Mengubah antara tanggal / waktu XML standar dan objek tanggal Java tampaknya seperti tugas yang cukup rutin dan saya terkejut bahwa saya harus menulis kode ini sama sekali.
Ada saran?
CATATAN: Kelas JAXB saya dibuat secara otomatis dari skema. Proses membangun proyek saya tidak memungkinkan saya untuk membuat perubahan manual pada kelas yang dibuat. Elemen xs: dateTime sedang dibuat oleh XJC sebagai XMLGregorianCalendar di kelas JAXB. Skema diperpanjang dan diubah secara berkala, jadi saya diizinkan untuk membuat perubahan terbatas pada file skema XSD.
UPDATE ON SOLUTION: Solusi yang diusulkan oleh Blaise memungkinkan saya untuk mengeluarkan XMLGregorianCalendar dari campuran dan menangani objek java.util.Calendar sebagai gantinya. Dengan menambahkan klausa pengikatan JAXB di bagian atas file skema saya, XJC dapat menghasilkan pemetaan yang lebih sesuai untuk xs: dateTime di kelas JAXB saya. Berikut beberapa cuplikan yang menunjukkan modifikasi pada file XSD saya.
Elemen root di 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">
Blok anotasi pengikatan JAXB, dimasukkan segera setelah elemen root di 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>
Karena bidang XML xs: dateTime juga menyimpan zona waktu, mungkin lebih baik bagi saya untuk bekerja dengan Kalender daripada Tanggal karena objek Kalender memiliki API yang cukup bagus untuk bekerja dengan lokal dan zona waktu. Bagaimanapun, saya jauh lebih senang menangani objek Kalender daripada XMLGregorianCalendar. Tidak perlu lagi metode konversi yang saya cantumkan di atas. Saya tidak mengerti sepenuhnya java.util.Date, tapi cukup dekat!
util
paket dan gunakan.Jawaban:
Mengapa tidak menggunakan file pengikat eksternal untuk memberi tahu XJC agar menghasilkan bidang java.util.Date alih-alih XMLGregorianCalendar?
Lihat juga Bagaimana cara memetakan xs: date ke java.util.Date? Blog
sumber
Dari XMLGregorianCalendar ke java.util.Date Anda cukup melakukan:
sumber
Dari java.util.Date ke XMLGregorianCalendar Anda cukup melakukan:
Kode diedit setelah komentar pertama @ f-puras, karena saya melakukan kesalahan.
sumber
Saya harus membuat beberapa perubahan untuk membuatnya berfungsi, karena beberapa hal tampaknya telah berubah untuk sementara waktu:
Berikut adalah contoh yang berfungsi, semoga ini membantu (saya menggunakan JodaTime tetapi dalam hal ini SimpleDate sudah cukup):
Di xsd, saya telah mengikuti referensi luar biasa yang diberikan di atas, jadi saya telah menyertakan anotasi xml ini:
sumber
Saya juga mengalami sakit kepala seperti ini. Singkirkan itu hanya dengan mewakili bidang waktu sebagai primitif lama di POJO saya. Sekarang generasi kode klien WS saya menangani semuanya dengan benar dan tidak ada lagi omong kosong XML-ke-Java. Dan tentu saja berurusan dengan millis di sisi Java itu sederhana dan tidak menyakitkan. Prinsip KISS rock!
sumber
Anda dapat menggunakan penyesuaian ini untuk mengubah pemetaan default ke java.util.Date
sumber
Menyesuaikan Kalender dan Tanggal saat Marshaling
Langkah 1: Siapkan jaxb binding xml untuk properti kustom, dalam hal ini saya menyiapkan tanggal dan kalender
Setp 2: Tambahkan file jaxb binding kustom ke Apache atau plugin terkait di opsi xsd seperti yang disebutkan di bawah ini
Setp 3: tulis kode untuk kelas CalendarConverter
Setp 4: Keluaran
sumber