복붙노트

[SPRING] Jackson 날짜 직렬화 - "유효하지 않은"날짜

SPRING

Jackson 날짜 직렬화 - "유효하지 않은"날짜

JSON 요청 / 응답을 직렬화 / 역 직렬화하는 Spring Boot를 사용하고 있습니다. 내가 피하고 싶습니다 ISO 형식으로 날짜를 deserialize하려고하면 행동을 건너 왔습니다.

유효하지 않은 달 또는 달의 달을 사용할 때 Jackson은 날짜에 일 / 월을 추가하여 처리합니다.

예를 들어

{
    "date": "2018-02-40T15:00:00+01:00"
}

Mon 3 월 12 일 15:00:00 CET 2018로 직렬화 해제됩니다.

또는

{
    "date": "2018-14-20T15:00:00+01:00"
}

2 월 20 일 수요일 15:00:00 CET 2019

어떻게 든 유효성 검사를 시행 할 수있는 방법이 있습니까? 직렬화 및 역 직렬화 기능 목록을보고 있었지만이 동작에 영향을 줄 수있는 항목을 찾을 수 없었습니다.

이전 Java Date API - java.util.Date를 사용하고 있습니다.

해결법

  1. ==============================

    1.당신의 대답은 나에게 올바른 방향을 알려주었습니다. Jackson은 2.9+ 이후 @JsonFormat 주석을 사용하여 관대 구성을 지원합니다.

    당신의 대답은 나에게 올바른 방향을 알려주었습니다. Jackson은 2.9+ 이후 @JsonFormat 주석을 사용하여 관대 구성을 지원합니다.

    @JsonFormat(lenient = OptBoolean.FALSE)
    

    그래서 스프링 부트 부모 POM을 사용하면서 POM의 jackson.version 속성 값을 무시해야했습니다.

    <jackson.version>2.9.4</jackson.version>
    

    다시 한 번 감사드립니다!

  2. ==============================

    2.이전 API를 사용하고 있으므로 사용중인 DateFormat과 연결된 캘린더에서 setLenient (false)를 호출하여 엄격 모드를 사용 설정합니다.

    이전 API를 사용하고 있으므로 사용중인 DateFormat과 연결된 캘린더에서 setLenient (false)를 호출하여 엄격 모드를 사용 설정합니다.

  3. ==============================

    3.

    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss+01:00"); 
    sdf.setLenient(false);
    objectMapper.setDateFormat(sdf);
    

    비슷한 질문 : Jackson ObjectMapper : 날짜 직렬화 및 직렬화 해제 문제

  4. ==============================

    4.스프링 부트를 사용하여 언급 한 것처럼, ObjectMapper에 대한 구성을 만들 수 있습니다.

    스프링 부트를 사용하여 언급 한 것처럼, ObjectMapper에 대한 구성을 만들 수 있습니다.

    @Configuration
    public class ObjectMapperConfig {
        @Bean
        public ObjectMapper objectMapper(){
            ObjectMapper mapper = new ObjectMapper();
    
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss+01:00");
            simpleDateFormat.setLenient(false);
            mapper.setDateFormat(simpleDateFormat);
    
            return mapper;
        }
    }
    

    그리고 매번 ObjectMapper를 삽입하기 만하면됩니다.

    @Autowired
    private ObjectMapper mapper;
    
  5. from https://stackoverflow.com/questions/48934700/jackson-date-deserialization-invalid-day-of-month by cc-by-sa and MIT license