必须转换日期和日程表类型的 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;
}

这条规则标记了 java.util.Datejava.util.Calendar 字段。 DataObject 对象中的 和 字段。 对于该规则,将提供自动修正,以添加注释 @JsonbDateFormat(value = JsonbDateFormat.TIME_IN_MILLIS ) 以将输出转换为纪元 milliseconds.After 应用自动修正后, 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 配置文件中添加 jsonb 功能。 例如,如果使用的是 jaxrs-2.1 功能部件,那么将添加 jsonb-1.0 功能部件。

有关 Jackson 和 Yasson 之间的行为差异的更多详细信息,请参阅 Is it time for a JSON binding standard? 文章“比较 Jackson 和 JSON-B 行为”。