必須轉換日期、時間及行事曆類型的 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
public class MyService {

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

    @GET
    @Path("/set")
    @Consumes(MediaType。APPLICATION_JSON) public void setDate(Date date) {
        //...
    } }

對於直接傳回 java.util.Datejava.util.Calendar 的 JAX-RS 資源方法,傳回類型應該變更為 long 類型以維護與 Jackson 相同的輸出。例如,如果某個方法將要傳回如下所示的 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 行為的是否要符合 JSON 連結標準?文章。