LocalDate, LocalTime, LocalDateTime은 Java 8에서 제공하는 시간 및 날짜 API이며, 주로 Java 8의 처리 시간 및 날짜의 처리 작업을 최적화하는 데 주로 사용됩니다. 그러나 Spring Boot 또는 Spring Cloud Feign을 사용하면 요청 매개 변수를 사용하거나 결과를 반환 할 때 다양한 문제가 발생하는 경우가 종종 있습니다. 이 기사에서는이 상황에서 발생하는 문제와이를 해결하는 방법에 대해 이야기 할 것입니다.
문제 현상
먼저 증상을 살펴 보겠습니다. 예를 들어, 다음 예는 다음과 같습니다.
@SpringBootApplicationPublic Class Application {public static void main (String [] args) {springApplication.run (application.class, args); } @RestController 클래스 HelloController {@postmapping ( "/user") public userDto user (@RequestBody userDto userDto) 예외 {return userDTO; }} @data @data @noargsconstructor @allargsconstructor static class userdto {private String username; 개인 지역화 생일; }}위의 코드는 간단한 Spring Boot 웹 응용 프로그램을 작성하여 LocalDate 유형의 데이터를 포함하는 사용자 정보를 제출할 수있는 인터페이스를 제공합니다. 현재 Feign을 사용 하여이 인터페이스를 호출하면 다음과 같은 오류가 발생합니다.
2018-03-13 09 : 22 : 58,445 WARN [HTTP-NIO-9988-Exec-3] org.springframework.web.servlet.mvc.support.defaulthandleRexceptionResolver- HTTP 메시지를 읽지 못했습니다. org.springframework.http.converter.httpmessagenoTreadableException : JSON 구문 분석 오류 : java.time.localdate의 인스턴스를 구성 할 수 없습니다. 중첩 예외는 com.fasterxml.jackson.databind.jsonmappingexception : java.time.localdate의 인스턴스를 구성 할 수 없습니다. 줄 : 1, 열 : 63] (참조 체인 : java.util.arraylist [0]-> com.didispace.userdto [ "생일"]))
분석 및 솔루션
위의 오류 메시지의 경우 JSON parse error: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value , Spring MVC에 익숙한 어린이 신발은 즉시 오류를 찾아서 지역 데이터의 부조화와 관련이 있어야합니다. 그러나이 오류 메시지 java.util.ArrayList[0]->com.didispace.UserDto["birthday"] 에 의해 혼란스러워 할 독자들이 여전히 남아있을 것입니다. 우리가 지명하고 제출 한 UserDto["birthday"] 는 LocalDate 객체입니다. ArrayList 목록 개체와 어떤 관련이 있습니까?
서버가 무엇을 반환하는지 확인하기 위해 우체부 또는 기타 정보를 통해 수동으로 요청을 보내도록 할 수도 있습니다. 예를 들어, 다음 이미지에 따라 요청할 수 있습니다.
위 그림에서 위에서 언급 한 혼란을 이해할 수 있습니다. 실제로, 기본적으로 Spring MVC는 LocalDate를 배열 유형으로 직렬화하고 Feign이 호출되면 ArrayList에 따라 여전히 처리되므로 자연스럽게 로컬 데이트 객체로 사막화 할 수 없습니다.
해결책
위의 문제를 해결하기 위해 Jackson이이를위한 완전한 직렬화 솔루션 세트를 제공하기 때문에 매우 간단합니다. POM.XML에서 Jackson-Datatype-JSR310 종속성 만 소개하면됩니다.
<pectionency> <groupid> com.fasterxml.jackson.datatype </groupid> <artifactid> Jackson-datatitype-jsr310 </artifactid> </dependency>
참고 : Spring Boot의 부모가 설정된 경우 특정 버전을 지정할 필요가 없으며 특정 버전을 지정하는 것이 좋습니다.
이 모듈에서 Java 8의 시간 날짜 API 직렬화 구현을 캡슐화하고 해당 특정 구현은이 클래스에 있습니다 : com.fasterxml.jackson.datatype.jsr310.javatimemodule (참고 : 일부 이전 버전은이 클래스에 미쳤습니다. 이 직렬화 모듈 만 위의 응용 프로그램 메인 클래스에만 추가하면 동시에 표준 ISO 8601 형식을 활성화합니다.
@BeanPublic ObjectMapper SerializingObjectMapper () {ObjectMapper ObjectMapper = new ObjectMapper (); ObjectMapper.disable (SerializationFeature.write_Dates_AS_TIMESTAMPS); ObjectMapper.registerModule (new javatimemodule ()); 반환 ObjectMapper;}현재 인터페이스에 액세스 할 때 지금 방금 인터페이스에 액세스 할 때 더 이상 배열 유형이 아니며 Feign 클라이언트를 호출 할 때 더 이상 오류가 발생하지 않습니다.
코드 예제
이 기사의 관련 예는 다음 저장소의 3-1-7 디렉토리를 볼 수 있습니다.
github : https://github.com/dyc87112/springboot-learning
Gitee : https://gitee.com/diidispace/springboot-learning
요약
위는 Spring Boot 및 Feign에서 Java 8 Time and Date API (LocalDate 등)를 사용하는 직렬화 문제입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!