LocalDate, Localtime, LocalDateTime son las API de hora y fecha proporcionadas por Java 8, que se utilizan principalmente para optimizar las operaciones de procesamiento de tiempo y fechas en Java 8 antes. Sin embargo, cuando usamos Spring Boot o Spring Cloud Feign, a menudo encontramos que se producirán varios problemas al usar parámetros de solicitud o resultados de devolución. En este artículo, hablaremos sobre los problemas que surgen en esta situación y cómo resolverlos.
Fenómeno de problemas
Primero echemos un vistazo a los síntomas. Por ejemplo, el siguiente ejemplo:
@SpringBootApplicationPublic Aplolation {public static void main (string [] args) {springApplication.run (application.class, args); } @RestController Class HELOCONTROLLER {@PostMapping ("/User") Public UserDTO User (@RequestBody UserDTO UserDTO) lanza la excepción {return userDTO; }} @Data @noargsconstructor @AllargSconstructor Static Class userdto {private String UserName; Cumpleaños privados locales; }}El código anterior construye una aplicación web de arranque de primavera simple, que proporciona una interfaz para enviar información del usuario, que contiene datos del tipo localDate. En este momento, si usamos Feign para llamar a esta interfaz, recibiremos el siguiente error:
2018-03-13 09: 22: 58,445 Warn [http-nio-9988-exec-3] org.springframework.web.servlet.mvc.support.defaulthandlerExceptionResolver-No se pudo leer el mensaje HTTP: org.springframework.http.converter.httpmessageNeTableException: JSON Error de Parse: no puede construir una instancia de Java.Time.LocalDate: ¿No se encuentra ningún constructor adecuado, no se puede deserializar desde el valor de objeto (constructor o creador predeterminado faltante, o tal vez necesite agregar información de tipo?); La excepción anidada es com.fasterxml.jackson.databind.jsonmappingException: no puede construir una instancia de java.time.localDate: no se encuentra un constructor adecuado, no se puede deserializar desde el valor de objeto (faltante constructor o creador, o tal vez necesite agregar/encender información de tipo?) At [fuente: java.iO.PushbackinputStream@67064c64c65c65c65c65; Línea: 1, columna: 63] (a través de la cadena de referencia: java.util.arraylist [0]-> com.didispace.userdto ["cumpleaños"])
Análisis y solución
Para el mensaje de error anterior JSON parse error: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value , los zapatos de los niños familiarizados con Spring MVC deberían poder localizar el error de inmediato y estar relacionado con la deserialización de la fecha local. Sin embargo, todavía habrá muchos lectores que se confundirán con este mensaje de error java.util.ArrayList[0]->com.didispace.UserDto["birthday"] . UserDto["birthday"] que nombramos y enviamos es un objeto local. ¿Qué tiene que ver con el objeto de lista ArrayList?
¿Podríamos enviar una solicitud manualmente a través de Postman u otra información para ver lo que devuelve el servidor? Por ejemplo, puede hacer una solicitud de acuerdo con la siguiente imagen:
De la figura anterior, podemos entender la confusión que mencioné anteriormente. De hecho, de manera predeterminada, Spring MVC serializa a LocalDate en un tipo de matriz, y cuando se llama Feign, todavía lo procesa de acuerdo con ArrayList, por lo que, por lo tanto, no se puede deserializar a un objeto local.
Solución
Para resolver el problema anterior, es muy simple, porque Jackson también proporciona un conjunto completo de soluciones de serialización para esto. Solo necesitamos presentar la dependencia de Jackson-Datatype-JSR310 en pom.xml, de la siguiente manera:
<Spendency> <ProupId> com.fasterxml.jackson.datatype </proupid> <artifactid> jackson-datatype-jsr310 </arfactid> </pendency>
Nota: Cuando se establece el padre de Spring Boot, no necesita especificar una versión específica, y no se recomienda especificar una versión específica.
Encapsula la implementación de la serialización de la API de la fecha de tiempo de Java 8 en este módulo, y su implementación específica está en esta clase: com.fasterxml.jackson.datatype.jsr310.javatimemodule (nota: algunas versiones anteriores son locas sobre esta clase "com.fasterxml.jackson.datatatype.jsr310 Solo necesitamos agregar este módulo de serialización a la clase principal de la aplicación anterior, y al mismo tiempo habilitar el formato estándar ISO 8601:
@BeanPublic ObjectMapper SerializingObjectMapper () {ObjectMapper ObjectMapper = new ObjectMapper (); ObjectMapper.disable (SerializationFeature.Write_Dates_AS_Timestamps); ObjectMapper.RegisterModule (new Javatimemodule ()); return ObjectMapper;}En este momento, cuando accedemos a la interfaz en este momento, ya no es un tipo de matriz, y los errores anteriores ya no ocurrirán cuando llamemos al cliente Feign.
Ejemplo de código
Para ejemplos relevantes en este artículo, puede ver el directorio del Capítulo 3-1-7 en el siguiente repositorio:
Github: https://github.com/dyc87112/springboot-lelarning
GITEE: https://gitee.com/diidispace/springboot-lelarning
Resumir
Lo anterior es el problema de serialización del uso de la API de hora y fecha de Java 8 (Date, etc.) en Spring Boot y Feign. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!