LocalDate, LocalTime, LocalDeTime são as APIs de hora e data fornecidas pelo Java 8, que são usadas principalmente para otimizar as operações de processamento de tempo e datas no Java 8 antes. No entanto, quando usamos o Spring Boot ou a Spring Cloud Feign, geralmente descobrimos que vários problemas ocorrerão ao usar parâmetros de solicitação ou retornar os resultados. Neste artigo, falaremos sobre os problemas que surgem nesta situação e como resolvê -los.
Problema fenômeno
Vamos dar uma olhada nos sintomas primeiro. Por exemplo, o exemplo a seguir:
@SpringbooTApplicationPublic Classe Application {public static void main (string [] args) {springapplication.run (application.class, args); } @RestController Classe Hellocontroller {@PostMapping ("/User") public Userdto User (@RequestBody UserDTO UserDTO) lança Exceção {return userdto; }} @Data @NoargSconstructor @allargsconstructor classe estática userdto {private string nome de usuário; Aniversário Privado LocalDate; }}O código acima cria um aplicativo simples de inicialização da mola, que fornece uma interface para enviar informações do usuário, que contém dados do tipo LocalDate. No momento, se usarmos Feign para chamar essa interface, receberemos o seguinte erro:
2018-03-13 09: 22: 58.445 Warn [http-nio-9988 -exec-3] org.springframework.web.servlet.mvc.support.defaulthandlerexceptionResolver-Falha na leitura da mensagem HTTP: org.springframework.http.converter.httpmessageNotReadableException: JSON Erro de análise: não pode construir a instância de java.time.localdate: nenhum construtor adequado não pode ser encontrado; A exceção aninhada é com.fasterxml.jackson.databind.jsonMappingException: não pode construir a instância de java.time.localdate: nenhum construtor adequado encontrado, não pode se desfazer do valor do objeto (Java.Prutor ou talvez precisar adicionar/habitar informações do tipo? Linha: 1, Coluna: 63] (Através da cadeia de referência: java.util.ArrayList [0]-> com.didispace.userdto ["aniversário"])
Análise e solução
Para a mensagem de erro acima JSON parse error: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value , os sapatos infantis familiarizados com o MVC da primavera devem ser capazes de localizar o erro imediatamente e estar relacionado à desserialização do local. No entanto, ainda haverá muitos leitores que ficarão confusos com esta mensagem de erro java.util.ArrayList[0]->com.didispace.UserDto["birthday"] . UserDto["birthday"] Nomeado e enviou é um objeto LocalDate. O que isso tem a ver com o objeto da lista Arraylist?
Podemos também enviar uma solicitação manualmente através do Postman ou de outras informações para ver o que o servidor retorna? Por exemplo, você pode fazer uma solicitação de acordo com a seguinte imagem:
Da figura acima, podemos entender a confusão que mencionei acima. De fato, por padrão, o Spring MVC serializa o LocalDate em um tipo de matriz e, quando o Feign é chamado, ele ainda o processa de acordo com a Arraylist, então, naturalmente, não pode ser desserializada para um objeto LocalDate.
Solução
Para resolver o problema acima, é muito simples, porque Jackson também fornece um conjunto completo de soluções de serialização para isso. Precisamos apenas apresentar a dependência de Jackson-Datatype-JSR310 em Pom.xml, como segue:
<Depencency> <PuerpId> com.fasterxml.jackson.datatype </groupiD> <TRARFACTID> Jackson-Datatype-jsr310 </stutifactId> </dependency>
NOTA: Quando o pai da bota da primavera estiver definido, você não precisa especificar uma versão específica e não é recomendável especificar uma versão específica.
Encapsular a implementação da serialização da API do Java 8 Date Date neste módulo, e sua implementação específica está nesta classe: com.fasterxml.jackson.datatype.jsr310.javatimemodule (Nota: algumas versões anteriores são loucas sobre esta classe "com.fasterxml.jackson.datypey.jsr3 são loucas sobre essa classe" Somente adicionar este módulo de serialização à classe principal do aplicativo acima e, ao mesmo tempo, ativar o formato ISO 8601 padrão:
@BeanPublic ObjectMapper serializeBjectMapper () {objectMapper ObjectMapper = new ObjectMapper (); objectMapper.Disable (serializationfeature.write_dates_as_timestamps); ObjectMapper.RegisterModule (New Javatimemodule ()); Retornar ObjectMapper;}No momento, quando estamos acessando a interface agora, ela não é mais um tipo de matriz e os erros acima não ocorrerão mais quando chamarmos o Feign Client.
Exemplo de código
Para exemplos relevantes neste artigo, você pode visualizar o diretório Capítulo 3-1-7 no repositório a seguir:
Github: https://github.com/dyc87112/springboot-learning
Gitee: https://gitee.com/diidispace/springboot-learning
Resumir
O exposto acima é o problema de serialização do uso da API Java 8 Time and Date (LocalDate, etc.) na bota de primavera e finge. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!