私は知っています JAXB(XMLバインディング用のJavaアーキテクチャ) は Blaise Doughanによるこの回答 に見られるようにJava.util.Dateオブジェクトをマーシャリング/アンマーシャリングできます。
しかし、 ZonedDateTime
などの Java 8 の新しい Java.timeパッケージ オブジェクトはどうですか?この新しく組み込まれたデータ型を処理するようにJAXBが更新されましたか?
Java SE 8では、JAXBはJava.timeタイプをサポートするようにまだ更新されていません。
実際、リファレンス実装にはこれに関連する issue があります。
これらのタイプを処理するには、 XmlAdapter
を作成して使用する必要があります。この投稿で説明されている Joda-Time 、 JAXBおよびJoda-Time:Dates and Times で行われるのと同様のアプローチを使用します。
Java.time 用のアダプタのこの実装を使用できる場合があります。
受け入れられた回答にリンクされているライブラリは、重要な詳細を強調しているため、使用できませんでした。XMLスキーマでは、日付/時刻の値により、タイムゾーンオフセットが欠落している可能性があります。アダプターは、この状況を処理できる必要があります。また、Javaには日付のみのデータ型がないという事実をサポートする必要があります。
jTextTimeライブラリ これを解決します。
ライブラリは、JDK8 OffsetXXX
日付/時刻クラスを中心に展開します。これらはXMLスキーマタイプdate
、dateTime
、およびtime
と(唯一の)自然な同等物であるためです。 。
このように使用します:
依存関係を追加:
<dependency>
<groupId>com.addicticks.oss</groupId>
<artifactId>jtexttime</artifactId>
<version> ... latest ...</version>
</dependency>
クラスに注釈を付ける:
public class Customer {
@XmlElement
@XmlJavaTypeAdapter(OffsetDateTimeXmlAdapter.class)
@XmlSchemaType(name="dateTime")
public OffsetDateTime getLastOrderTime() {
....
}
@XmlElement
@XmlJavaTypeAdapter(OffsetDateXmlAdapter.class)
@XmlSchemaType(name="date")
public OffsetDateTime getDateOfBirth() { // returns a date-only value
....
}
}
各クラスに個別に注釈を付けたくない場合は、説明されているようにパッケージレベルの注釈を使用できます ここ 。
Xjcツールを使用してXSDファイルからJavaクラスを生成する場合、これは これも説明されています です。