Spring Boot 와 Feign 에서 Java 8 시간 날짜 API(LocalDate 등)를 사용 하 는 직렬 화 문 제 를 해결 합 니 다.
문제 현상
증상 부터 살 펴 보 자.예 를 들 어 다음 의 예:
@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 등)를 사용 하 는 서열 화 문 제 를 해결 하 는 데 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Liquibase】DB 작성·테이블 정의 변경신규 스타터 프로젝트 작성 Liquibase와 MySQL 선택 application.properties에 DB 정보 넣기 MySQL에서 "testdatabase"라는 데이터베이스 만들기 빌드 종속성 추가 build....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.