date 型および 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]

JSON 型データを作成または取り込むすべての JAX-RS リソース・メソッドが影響を受ける可能性があります。この規則は、JAX-RS リソース・メソッドによって作成または取り込まれるオブジェクトに含まれている java.util.Date フィールドまたは java.util.Calendar フィールドにフラグを立てます。

以下に、java.util.Date フィールドと java.util.Calendar フィールドを含む Java オブジェクトを作成および取り込む JAX-RS リソース・メソッドの例を示します。

@Path("/")
@ApplicationScoped
public class MyService {

@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON)
public DataObject getData() {
//...
}

@GET
@Path("/set")
@Consumes(MediaType.APPLICATION_JSON)
public void setData(DataObject data) {
//...
}
}
import java.util.Calendar;
import java.util.Date;

public class DataObject {
public Date juDate;
public Calendar juCalendar;
}

この規則は、DataObject オブジェクト内の java.util.Date フィールドおよび java.util.Calendar フィールドにフラグを立てます。ソース・スキャナーで、クイック・フィックスをこの規則に使用できます。 クイック・フィックスは、出力をエポック・ミリ秒に変換する @JsonbDateFormat(value = JsonbDateFormat.TIME_IN_MILLIS) をフィールドに追加します。クイック・フィックスが実行された後、DataObject クラスは以下のように変更されます。

import java.util.Calendar;
import java.util.Date;
import javax.json.bind.annotation.JsonbDateFormat;

public class DataObject {
@JsonbDateFormat(value = JsonbDateFormat.TIME_IN_MILLIS)
public Date juDate;
@JsonbDateFormat(value = JsonbDateFormat.TIME_IN_MILLIS)
public Calendar juCalendar;
}

注: クイック・フィックスによって追加された @javax.json.bind.annotation.JsonbDateFormat アノテーションにアクセスするには、jsonb フィーチャーを Liberty server.xml 構成ファイルに追加する必要があります。例えば、jaxrs-2.1 フィーチャーを使用している場合は、jsonb-1.0 フィーチャーを追加します。

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