날짜, 시간 및 달력 유형의 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 자원 메소드에 플래그를 지정합니다.

앞서 나열된 유형을 생성하거나 이용하는 메소드는 변환해야 합니다. 이러한 유형을 포함하는 오브젝트를 생성하거나 이용하는 메소드 또한 처리해야 한다는 점을 참고하십시오.

2진 스캐너는 앞서 언급된 유형을 직접 생성하거나 이용하는 메소드만 발견합니다. 그러나 특정 메소드가 이러한 유형을 포함하는 오브젝트를 이용하거나 생성하는 경우 2진 스캐너는 유형 사용을 발견하지 않습니다. 2진 스캐너를 사용하는 경우에는 JSON 또는 와일드카드를 지정하는 모든 @javax.ws.rs.Produces@javax.ws.rs.Consumes 어노테이션을 검토하고 이러한 해당 유형을 포함하는 오브젝트를 생성하거나 이용하는 모든 메소드가 변환되었는지 확인하십시오.

이 규칙에서 플래그를 지정할 JAX-RS 자원 메소드의 예는 다음과 같습니다.

@Path("/ ")
@ApplicationScoped
공용 클래스 MyService {

    @GET
    @Path("/get ")
    @Produces(MediaType.APPLICATION_JSON) 공용 날짜 getDate() {
        //...
    }

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

java.util.Date 또는 java.util.Calendar를 직접 리턴하는 JAX-RS 자원 메소드의 경우 Jackson과 동일한 출력을 유지하기 위해 리턴 유형을 유형 long으로 변경해야 합니다. 예를 들어, 메소드가 다음과 같이 Date 오브젝트를 리턴하는 경우:

    @GET
    @Path("/get ")
    @Produces(MediaType.APPLICATION_JSON) 공용 날짜 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 바인딩 표준 필요? 문서를 참조하십시오.