必須轉換日期及行事曆類型的 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.Datejava.util.Calendar 欄位。

以下是產生及耗用包含 java.util.Datejava.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.Datejava.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 行為的是否要符合 JSON 連結標準?文章。