No SpringMVC, você pode usar as duas anotações @RequestBody e @ResponseBody para concluir a conversão de pacotes de solicitação em objetos e se opor a pacotes de resposta, respectivamente. Esse mecanismo flexível de conversão de mensagens é usado. Use o httpmessageConverter configurado pelo sistema para analisar e, em seguida, vincule os dados correspondentes ao objeto a ser retornado.
HttpinputMessage
Esta classe é uma abstração de uma mensagem de solicitação HTTP no SpringMVC. No método read () de httpmessageConverter, existe um parâmetro formal do httpinputMessage, que é a abstração interna do receptor "Mensagem de solicitação" tocada pelo conversor de mensagens do Springmvc. O conversor da mensagem extrai mensagens da "mensagem de solicitação" de acordo com as regras e as converte em objetos declarados no parâmetro formal do método.
pacote org.springframework.http; importar java.io.ioException; importar java.io.inputStream; interface pública httpinputMessage estende httpMessage {inputStream getBody () lança IoException;}HttpOutputMessage
No método write () de httpmessageConverter, existe um parâmetro formal do httputputMessage, que é a abstração interna do receptor "Mensagem de resposta" usada pelo conversor de mensagens do Springmvc. O conversor da mensagem grava a "mensagem de resposta" na mensagem de resposta de acordo com certas regras.
pacote org.springframework.http; importar java.io.ioException; importar java.io.outputStream; interface pública httpOutputMessage estende httpMessage {outputStream getBody () lança IoException;}HttpmessageConverter
/ * * Copyright 2002-2010 O autor original ou autores. * * Licenciado sob a licença Apache, versão 2.0 (a "licença"); * Você não pode usar esse arquivo, exceto em conformidade com a licença. * Você pode obter uma cópia da licença em * * http://www.apache.org/license/license-2.0 * *, a menos que exigido pela lei aplicável ou acordada por escrito, o software * distribuído sob a licença seja distribuído em uma base "como é" *, sem garantia ou condição de qualquer tipo, seja expresso ou implícito. * Consulte a licença para as permissões e limitações do idioma específico e * sob a licença. */package org.springframework.http.converter; importar java.io.ioException; importar java.util.list; importar org.springframework.http.httpinputMessage; importerem org.springframework.http.httputputMess; org.springframework.http.mediatype; interface pública httpmessageConverter <t> {boolean canilRead (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;}A interface httpmessageConverter fornece 5 métodos:
Os parâmetros dos métodos de leitura e gravação incluem objetos httpinputMessage e httputputMessage, respectivamente. Esses dois objetos representam as peças de solicitação e resposta em uma comunicação HTTP, respectivamente. O fluxo de entrada correspondente e o fluxo de saída podem ser obtidos através do método getBody.
Atualmente, existem muitos conversores fornecidos por padrão na primavera, incluindo:
| nome | efeito | Leitura de suporte MediaType | Escreva Suporte MediaType |
|---|---|---|---|
| ByteArrayhttpMessageConverter | Conversão de dados e matrizes de bytes | / | aplicação/stream de octeto |
| StringhttpMessageConverter | Conversão de dados e tipos de string | texto/* | texto/simples |
| FormhttpmessageConverter | Conversão de forma e multivaluemap <string, string = ""> | APLICAÇÃO/X-WWW-FORM-URLENCODED | APLICAÇÃO/X-WWW-FORM-URLENCODED |
| OrigemhttpMessageConverter | Transform.Source Conversão de dados e javax.xml.transform.source | texto/xml e aplicativo/xml | texto/xml e aplicativo/xml |
| MarshallinghttpMessageConverter | Converter dados XML usando Springmarshaller/UNMARSHALLER | texto/xml e aplicativo/xml | texto/xml e aplicativo/xml |
| MappingJackson2httpMessageConverter | Converter dados JSON usando o objectmapper de Jackson | Aplicação/JSON | Aplicação/JSON |
| MappingJackson2xmlHttpMessageConverter | Converta dados XML usando o xmlmapper de Jackson | APLICAÇÃO/XML | APLICAÇÃO/XML |
| BufferImageHttpMessageConverter | Conversão de dados e java.awt.image.bufferedimage | Todos os tipos suportados pela API de E/S Java | Todos os tipos suportados pela API de E/S Java |
HTTPMESSAGECONVERTER Processo de correspondência:
@RequestBody Anotation: De acordo com o tipo de conteúdo da parte do cabeçalho do objeto de solicitação, corresponda ao httpmessageConverter apropriado um por um para ler os dados.
Objeto privado ReadwithMessageConverters (MethodParameter MethodParam, httpinputMessage inputMessage, classe Paramtype) lança exceção {MediaType contentType = inputMessage.GEtheaders (). GetContentType (); if (contentType == null) {stringbuilder Builder = new StringBuilder (classutils.getShortName (MethodParam.getParameterType ()); String paramname = MethodParam.getParameterName (); if (paramname! = null) {builder.append (''); construtor.append (paramname); } lança novo httpmediaTypeNotSupportEdException ("Não é possível extrair parâmetro (" + construtor.toString () + "): nenhum tipo de conteúdo encontrado"); } List <DordaType> allSupportedMediTypes = new ArrayList <AcretType> (); if (this.messageConverters! = null) {for (httpmessageConverter <?> messageconverter: this.messageConverters) {allSupportDediatypes.addall (messageconverter.getSupportedMediaTyPes ()); if (messageconverter.CanRead (Paramtype, contentType)) {if (logger.isdebugenabled ()) {Logger.debug ("Reading [" + Paramtype.getName () + "] como /" " + contentType +" /"usando [" + messageconverter + "); } return mesageconverter.read (paramtype, inputMessage); }}} lança novo httpmediaTypeNotSupportEdException (contentType, allSupportedMediTypes); } @ResponseBody Anotation: De acordo com o atributo aceitador (separado por vírgula) da parte do cabeçalho do objeto de solicitação, um por um, e travesse para encontrar o httpmessageConverter que pode ser processado.
Void privado WriteWithMesSageconverters (Objeto retornarValue, httpinputMessage inputMessage, httpOutputMessage outputMessage) lança a ioException, httpmediTypeNotAcceptableException {list <lipeDype>. if (aceitaMediTyPes.isEmpty ()) {aceitaMediTypes = collection.singletonList (mediatype.all); } Mediatype.sortByQualityValue (aceitaMediTyPes); Classe <?> ReturnValuetype = returnValue.getClass (); List <PomentyType> allSupportedMediTypes = new ArrayList <AcretType> (); if (getMessageConverters ()! = null) {for (mediatype aceitoumediatype: aceedmediatypes) {for (httpmessageConverter messageconverter: getMessageConverters ()) {if (mesageconver.canwrite (returvaluType, messageconverter.write (returnValue, aceitaMediType, outputMessage); if (logger.isdebugenabled ()) {mediaType contentType = outputMessage.getheaders (). getContentType (); if (contentType == null) {contentType = aceitaMediaType; } logger.debug ("escrito [" + returnValue + "] AS /" " + contentType +" /"usando [" + messageconverter + "]"); } this.ResponsearGumentUsed = true; retornar; }}} para (httpmessageConverter messageconverter: messageconverters) {allsupportedMediaTypes.addall (messageconverter.getSupportedMediTypes ()); }} lança novo httpmediaTypeNotAcceptableException (allSupportedMediTypes); }Personalize um conversor JSON
classe CUSTERJSONHTTPMESSAGECONVERTER implementa httpmessageConverter {// JONSON MAPPING CLASS DE MAPPLAÇÃO PRIVADOR MAPPPER = new ObjectMapper (); // O tipo de suporte deste conversor: Application/JSON Private List SupportedMediTypes = Arrays.asList (MediaType.Application_Json); / *** Determine se o conversor pode converter o conteúdo de entrada em Java Type* @param clazz java que precisa ser convertido* @param mediatype mediatype para esta solicitação* @return*/ @Override public boolean canLread (classe clazz, mediatypepe) {if (mediaType == null) {MediaTypepe) {if (mediaType == null) {MediaTypepe) {if (mediatype ==l) {mídia mídia) {if (mediaType ==). } para (MediaType supportedMediType: getSupportedMediTypes ()) {if (suportededMediType.includes (mediaType)) {return true; }} retornar false; } / *** Determine se o conversor pode converter tipos de java para o conteúdo de saída especificado* @param clazz O tipo Java que precisa ser convertido* @param mediatype mediatype para esta solicitação* @return* / @Override public boolean canwrite (classe clazz, mediape mediaTyTepe) {se mídia (mídia nultyty) {return true; } para (MediaType supportedMediType: getSupportedMediTypes ()) {if (suportededMediType.includes (mediaType)) {return true; }} retornar false; } / ** * Get MediaType suportado por este conversor * @RETURN * / @Override list Public List getSupportedMediTypes () {return supportedMediaTypes; } / *** Leia o conteúdo da solicitação e converta o JSON em um objeto Java* @param clazz O tipo Java que precisa ser convertido* @param inputMessage Objeto de solicitação* @return* @throws ioexception* @THROWS HTTPMESSAGENOTRADEEXCECTIONS* / @Override Object Public Object (Class. HttpMessageNotLeAltException {return mapper.readValue (inputMessage.getbody (), clazz); } / *** Converta o objeto java em json para retornar conteúdo* @param o objeto que precisa ser convertido* @param contentType Retorno tipo* @param outputMessage Objeto de recebimento* @THOWSCECTIONE* @THTTPMESTTYTHTYTTHTEXCECTIVEXEXCECTION / @Override Void public (ObjectOpMETETEMPETTHTTYTTHTTY IoException, httpMessageNotWritableException {mapper.WriteValue (outputMessage.getBody (), O); }}Personalize Mappingjackson2httpMessage
Pode ser visto no método de gravação na classe pai abstactttpmessageConverter de Mappingjackson2httpmessageConverter que o método grava dados no fluxo de saída que retorna o resultado através do método write -Internal, para que você só precisa substituir o método:
@BeanPublic Mappingjackson2httpMessageConverter MappingJackson2httpMessAgeconverter () {Retorne o novo Mappingjackson2httpMessageConverter () {// reescreva o método WRITENNAL E ENCRIPTION EM RETORNO ANTESENDIVENTE OSTERRIVERTO @STIDOTRIRTERTERTERSTERTIRTERTERSTERTIMATETROT (// reescreva o método Write e o encerramento antes do retenção, o conteúdo da retenção, o reescrito, a reescrita do objeto. outputMessage) lança IoException, httpMessageNotWritableException {// Use o objectMapper de Jackson para converter objetos Java em JSON String ObjectMapper Mapper = new ObjectMapper (); String json = mapper.WriteValuEasString (objeto); Logger.error (JSON); // Encrypt string resultado = json + "criptografado!"; Logger.error (resultado); // output outputMessage.getBody (). Write (resultado.getBytes ()); }};} Depois disso, você precisa configurar esse conversor personalizado na primavera. Aqui você adiciona um conversor personalizado reescrevendo o método ConfigureMessaGeconverters no WebMVCConfigurer:
// Adicione um conversor personalizado @OverridePublic void ConfigureMessaGeconverters (List <httpmessageConverter <? >> conversores) {converters.add (Mappingjackson2httpMessageConverter ()); super.configuremessageConverters (conversores);}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.