날짜 및 달력 유형의 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.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 필드에 플래그를 지정합니다. 소스 스캐너에서 이 규칙에 빠른 수정사항을 사용할 수 있습니다. 빠른 수정사항은 epoch 밀리초로 출력을 변환하는 필드에 @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 바인딩 표준 필요? 문서를 참조하십시오.