date 型、time 型、および calendar 型の JSON バインディングを変換する必要がある

JAX-RS 2.1 では、JSON オブジェクトと Java オブジェクトとの間のシリアライゼーションおよびデシリアライゼーションに使用される内部ライブラリーが、Jackson から Yasson に変更されました。Yasson は、JSON-B の参照実装です。以下の例に示すように、Jackson と Yasson は、時刻に関連したオブジェクトを異なる方法でシリアライズします。

Jackson Yasson
java.util.Date 726213720000 1993-02-05T06:02:00Z[UTC]
java.util.Calendar 726213720000 1993-02-05T00:00:00-06:00[America/Chicago]
java.time.Instant { "epochSecond":726213720, "nano":0 } 1993-02-05T06:02:00Z
java.time.LocalDate { "year":1993, "month":"FEBRUARY", "dayOfMonth":5, ... } 1993-02-05

この規則により、以下のタイプの JSON タイプのデータを生成またはコンシュームする JAX-RS リソース・メソッドにフラグを立てます。

前記のリストにあるいずれかのタイプを生成またはコンシュームするメソッドは、変換される必要があります。また、それらのいずれかのタイプを含んでいるオブジェクトを生成またはコンシュームするメソッドも対処が必要になります。

バイナリー・スキャナーは、前記のタイプを直接的にコンシュームまたは生成するメソッドのみを検出します。しかし、それらのタイプを含んでいるオブジェクトをメソッドがコンシュームまたは生成する場合、バイナリー・スキャナーはそのようなタイプ使用を検出しません。バイナリー・スキャナーを使用している場合は、JSON またはワイルドカードが指定された @javax.ws.rs.Produces および @javax.ws.rs.Consumes アノテーションをすべて見直して、該当するいずれかのタイプを含んでいるオブジェクトを生成またはコンシュームするメソッドが確実に変換されるようにしてください。

以下に、この規則でフラグを立てられる JAX-RS リソース・メソッドの例を示します。

@Path(「/」)
@ApplicationScoped
公開クラス MyService {

    @GET
    @Path(「/get」)
    @Produces(MediaType。APPLICATION_JSON) public Date getDate() {
        //...
    }

    @GET
    @Path(「/set」)
    @Consumes(MediaType。APPLICATION_JSON) public void setDate(日付) {
        //...
    } }

java.util.Date または java.util.Calendar を直接返す JAX-RS リソース・メソッドの場合、Jackson と同じ出力を維持するために、戻りの型は、long 型に変更する必要があります。例えば、以下のようにメソッドが Date オブジェクトを返す場合があります。

    @GET
    @Path(「/get」)
    @Produces(MediaType。APPLICATION_JSON) public Date getDate() {
        return new Date(...);
    }

メソッドは以下のように変更できます。

    @GET
    @Path(「/get」)
    @Produces(MediaType。APPLICATION_JSON) public long getDate() {
        return new Date(...).getTime();
    }

java.time.LocalDate 型および java.time.Instant 型の場合、JSON-B/Yasson フォーマットを処理するように、日付を取り込むコードを調整した方がより簡単です。

Jackson と Yasson の動作の違いについて詳しくは、Jackson と JSON-B の動作を比較した Is it time for a JSON binding standard? という記事を参照してください。