web-dev-qa-db-ja.com

JAXBはJava.timeオブジェクトを処理できますか?

私は知っています JAXB(XMLバインディング用のJavaアーキテクチャ)Blaise Doughanによるこの回答 に見られるようにJava.util.Dateオブジェクトをマーシャリング/アンマーシャリングできます。

しかし、 ZonedDateTime などの Java 8 の新しい Java.timeパッケージ オブジェクトはどうですか?この新しく組み込まれたデータ型を処理するようにJAXBが更新されましたか?

24
Basil Bourque

Java SE 8では、JAXBはJava.timeタイプをサポートするようにまだ更新されていません。

実際、リファレンス実装にはこれに関連する issue があります。

これらのタイプを処理するには、 XmlAdapter を作成して使用する必要があります。この投稿で説明されている Joda-TimeJAXBおよびJoda-Time:Dates and Times で行われるのと同様のアプローチを使用します。

Java.time 用のアダプタのこの実装を使用できる場合があります。

25
bdoughan

受け入れられた回答にリンクされているライブラリは、重要な詳細を強調しているため、使用できませんでした。XMLスキーマでは、日付/時刻の値により、タイムゾーンオフセットが欠落している可能性があります。アダプターは、この状況を処理できる必要があります。また、Javaには日付のみのデータ型がないという事実をサポートする必要があります。

jTextTimeライブラリ これを解決します。

ライブラリは、JDK8 OffsetXXX日付/時刻クラスを中心に展開します。これらはXMLスキーマタイプdatedateTime、および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クラスを生成する場合、これは これも説明されています です。

0
lbruun