Acredito que os desenvolvedores que usaram a Spring usaram as anotações @RequestBody e @Responsebody e podem analisar diretamente a entrada no JSON e a saída no JSON. No entanto, as solicitações e respostas HTTP são baseadas em texto, o que significa que o navegador e o servidor se comunicam trocando texto original, e isso é na verdade httpmessageConverter desempenhando um papel.
HttpmessageConverter
O pacote de resposta de solicitação HTTP é na verdade uma string. Quando a mensagem de solicitação for inserida em um programa Java, ela será encapsulada em um fluxo de servletInputStream. O desenvolvedor lerá a mensagem e o pacote de resposta produzirá o pacote de resposta através do fluxo ServletOutputStream.
Somente o pacote de string original pode ser lido no fluxo e o mesmo é verdadeiro para o fluxo de saída. Então, quando a mensagem chega ao Springmvc/Springboot e sai do Springmvc/Springboot, há um problema de converter seqüências em objetos Java. Esse processo, no Springmvc/Springboot, é resolvido através de httpmessageConverter. HTTPMESSAGECONVERTER Código fonte:
interface pública httpmessageConverter <t> {boolean canRread (classe <?> clazz, mediatype mediatype); CANWRITE BOOLEANS (classe <?> clazz, mediatype mediatype); List <PomentyType> getSupportedMediTypes (); T leia (classe <? Extende t> clazz, httpinputMessage inputMessage) lança IoException, httpMessageNotReadableException; Void Write (T t, MediaType contentType, httpOutputMessage OutputMessage) lança IoException, httpMessageNotWritableException;}Aqui está um exemplo para ilustrar,
@RequestMapping ("/teste")@ResponseBodyPublic String Test (@RequestBody String param) {return "param '" + param + "'";}Antes da solicitação entrar no método de teste, a classe de implementação HTTPMESSASAGECONVERTER correspondente será selecionada de acordo com a anotação @RequestBody para analisar os parâmetros de solicitação na variável param. Como os parâmetros aqui são de string, a classe StringhttpMessageConverter é usada aqui. Seu método CanRead () retorna true e, em seguida, o método read () lerá os parâmetros de solicitação da solicitação e se vinculará à variável param do método test ().
Da mesma forma, quando o método de teste é executado, pois o valor de retorno identifica @ResponseBody, Springmvc/Springboot usará o método write () do stringhttpmessageConverter e escreverá o resultado como um valor de sequência para a mensagem de resposta. Obviamente, o método canwrite () retorna true neste momento.
Pegue a figura a seguir para descrever brevemente todo o processo:
Durante o processamento da primavera, uma mensagem de solicitação e uma mensagem de resposta são abstraídas em uma mensagem de solicitação httpinputMessage e uma mensagem de resposta httputputMessage, respectivamente.
Ao processar uma solicitação, o conversor de mensagens apropriado vincula a mensagem de solicitação a um objeto de parâmetro formal no método. Aqui, pode haver vários formulários de mensagem diferentes no mesmo objeto, como JSON e XML. O mesmo vale para responder a solicitações.
Na primavera, para diferentes formulários de mensagem, existem diferentes classes de implementação HTTPMESSAGECONVERTER para lidar com vários formulários de mensagem. Quanto às diferentes implementações de várias mensagens analisando, elas estão em diferentes classes de implementação HTTPMESSAGECONVERTER.
Substitua @Response HttpMessageConverter
Aqui está um exemplo de trampolim. Em Springmvc/Springboot, a anotação @Requestbody usa Jackson para analisar o JSON por padrão. Veja o seguinte exemplo:
@Controlador @requestmapping ("/user") classe pública UserController {@RequestMapping ("/testt") @ResponseBody Public User Testt () {Usuário Usuário = novo Usuário ("Nome", 18); devolver usuário; }} Public class Usuário {private String Nome de usuário; idade inteira privada; telefone inteiro privado; e -mail privado de string; usuário público (nome de string de usuário, idade inteira) {super (); this.UserName = Nome de usuário; this.age = idade; }}O acesso ao navegador /usuário /teste retorna da seguinte forma:
Este é o resultado do uso de Jackson Parsing. Agora vamos alterá -lo para o uso do objeto Fastjson Parsing. Aqui, substituímos o padrão httpmessageConverter, o que significa usar o FastJSONHTTPMESSAGECONVERTER para lidar com a conversão entre os objetos Java e HttpinputMessage/httpOutputMessage.
Primeiro, crie uma nova classe de configuração para adicionar a configuração FastJSONHTTPMESSAGECONVERTER. Spring 4.x recomenda o uso do método de anotação de configuração Java, ou seja, não há arquivo XML e o Springboot é ainda mais.
Importar com.alibaba.fastjson.serializer.serializerfeature; importar com.alibaba.fastjson.support.config.fastjsonConfig; import com.alibaba.fastjson.support.spring.fastjsonhttpmessageconverter; org.springframework.boot.autoconfigure.web.HttpMessageConverters;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.converter.HttpMessageConverter;import Java.nio.charset.charset; @ConfigurationPublic Classe httpMessageConverterConfig {// Apresentado Fastjson para analisar JSON, não use o pacote Jackson // Fastjson Jar deve ser introduzido em Pom.xml e a versão deve ser maior que 1.2.10 @ fastJSONHTTPMESSAGECONVERTERS () {// 1. Defina um objeto que converte a mensagem fastJSONHTTPMESSAGECONVERTER FASTCONVERTER = new FastJSONHTTPMESSAGECONVERTER (); // 2. Adicionar informações de configuração fastjson fastjsonConfig fastjsonConfig = new FastJSONCONFIG (); Serializerfeature [] serializerfeatures = new serializerfeature [] {// A chave de saída é uma citação dupla // serializerfeature.quotefieldNames, // se deve produzir um campo como nulo, se for nulo, se o campo é exibido ///14, se o campo é o fielding.WritemapnullUlUe, // se é o número de fielding.WritemAlullue, // Serializerfeature.WriteNullNumberasZero, // Se o campo da lista for nulo, a saída será [], não é o serializador nulo. Serializerfeature.writenullbooleanasfalse, // Data Converter serializerfeature.WrateedEusedEformat, // Referência circular serializerfeature.disableCirculareferencetectect,}; fastjsonConfig.setSerializerFeatures (SerializerFeatures); fastjsonConfig.SetcharSet (charset.ForName ("UTF-8")); // 3. Adicionar informações de configuração no convert fastConverter.setFastJSONCONFIG (fastjsonConfig); // 4. Adicione converter para converter httpmessageConverter <?> Converter = fastConverter; devolver novos httpmessageConverters (conversor); }}Aqui, se o valor do tipo String for nulo, ele retornará "", se o valor de NULL, ele retornará 0, reiniciará o aplicativo, acessará a interface /Usuário /Testt novamente e retornará da seguinte maneira:
Você pode ver que o NULL é convertido para "" ou 0 no momento.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.