Spring Boot 와 Feign 에서 Java 8 시간 날짜 API(LocalDate 등)를 사용 하 는 직렬 화 문 제 를 해결 합 니 다.

LocalDate,LocalTime,LocalDateTime 은 자바 8 이 제공 하기 시작 한 시간 날짜 API 로 자바 8 이전에 시간 날짜 에 대한 처리 작업 을 최적화 하 는 데 사용 된다.그러나 우 리 는 Spring Boot 를 사용 하거나 Spring Cloud Feign 을 사용 할 때 요청 파 라 메 터 를 사용 하거나 결과 에 LocalDate,LocalTime,LocalDateTime 이 있 을 때 여러 가지 문제 가 발생 하 는 것 을 발견 할 수 있 습 니 다.본 고 는 이런 상황 에서 발생 하 는 문제 와 어떻게 해결 하 는 지 에 대해 이야기 하고 자 한다.
문제 현상
증상 부터 살 펴 보 자.예 를 들 어 다음 의 예:

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
  @RestController
  class HelloController {
    @PostMapping("/user")
    public UserDto user(@RequestBody UserDto userDto) throws Exception {
      return userDto;
    }
  }
  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  static class UserDto {
    private String userName;
    private LocalDate birthday;
  }
}
위의 코드 는 간단 한 Spring Boot 웹 애플 리 케 이 션 을 구축 하여 사용자 정 보 를 제출 하 는 인 터 페 이 스 를 제공 합 니 다.사용자 정보 에는 LocalDate 형식의 데이터 가 포함 되 어 있 습 니 다.이 때 만약 우리 가 Feign 을 사용 하여 이 인 터 페 이 스 를 호출 할 때 다음 과 같은 오 류 를 얻 을 수 있 습 니 다.

2018-03-13 09:22:58,445 WARN [http-nio-9988-exec-3] org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
 at [Source: java.io.PushbackInputStream@67064c65; line: 1, column: 63] (through reference chain: java.util.ArrayList[0]->com.didispace.UserDto["birthday"])
분석 하여 해결 하 다
위의 오류 정보JSON parse error: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value Spring MVC 를 잘 아 는 어린이 신발 은 바로 위치 추적 오류 가 LocalDate 의 반 직렬 화 와 관련 이 있 을 것 입 니 다.그러나 여전히 많은 독자 들 이 이 잘못된 정보 에 곤 혹 스 러 워 할 것 이다.우리 가 제출 한java.util.ArrayList[0]->com.didispace.UserDto["birthday"] LocalDate 대상 이 라 고 이름 을 지 었 습 니 다.Array List 목록 대상 과 무슨 관계 가 있 습 니까?
우 리 는 postman 등 을 통 해 서버 가 돌아 오 는 것 이 무엇 인지 손 으로 요청 해도 무방 하 다.예 를 들 어 다음 그림 에 따라 요청 을 할 수 있 습 니 다.
 
위의 그림 에서 우 리 는 위 에서 언급 한 곤 혹 스 러 움 을 이해 할 수 있다.실제로 기본 적 인 상황 에서 Spring MVC 는 LocalDate 에 대해 하나의 배열 형식 으로 직렬 화 되 었 고 Feign 은 호출 할 때 Array List 에 따라 처리 되 었 기 때문에 LocalDate 대상 으로 반 직렬 화 할 수 없다.
해결 방법
위의 문 제 를 해결 하기 위해 매우 간단 합 니 다.잭 슨 도 이 를 위해 일련의 직렬 화 방안 을 제 공 했 기 때문에 우 리 는 pom.xml 에 잭 슨-datatype-jsr 310 의존 을 도입 해 야 합 니 다.구체 적 으로 다음 과 같 습 니 다.

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
메모:spring boot 의 parent 를 설정 한 경우 구체 적 인 버 전 을 지정 할 필요 도 없고 구체 적 인 버 전 을 지정 하 는 것 도 권장 하지 않 습 니 다.
이 모듈 에 서 는 자바 8 의 시간 날짜 API 직렬 화 실현 을 패키지 합 니 다.이 클래스 에서 구체 적 으로 구현 되 었 습 니 다.com.fasterxml.jackson.datatype.jsr 310.JavaTimeModule(주의:일부 빠 른 버 전 은 이 클래스 에서'com.fasterxml.jackson.datatype.jsr 310.JSR 310 Module'으로 전 환 됩 니 다.의존 도 를 설정 한 후에 우 리 는 위의 응용 메 인 클래스 에 이 직렬 화 모듈 을 추가 하고 표준 ISO 8601 형식 을 켜 야 합 니 다.

@Bean
public ObjectMapper serializingObjectMapper() {
  ObjectMapper objectMapper = new ObjectMapper();
  objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
  objectMapper.registerModule(new JavaTimeModule());
  return objectMapper;
}
이때 저 희 는 방금 전 인 터 페 이 스 를 방문 하면 더 이상 배열 형식 이 아니 라 Feign 클 라 이언 트 의 호출 에 도 위의 오류 가 발생 하지 않 습 니 다.
코드 예제
본 논문 의 관련 예 는 아래 창고 에 있 는 Chapter 3-1-7 디 렉 터 리 를 볼 수 있다.
Github: https://github.com/dyc87112/SpringBoot-Learning
Gitee: https://gitee.com/didispace/SpringBoot-Learning
총결산
위 에서 기술 한 것 은 편집장 이 여러분 에 게 소개 한 Spring Boot 와 Feign 에서 자바 8 시간 날짜 API(LocalDate 등)를 사용 하 는 서열 화 문 제 를 해결 하 는 데 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기