Dans SpringMVC, vous pouvez utiliser les deux annotations @Requestbody et @ResponseBody pour compléter la conversion des paquets de demande en objets et des objets aux paquets de réponse, respectivement. Ce mécanisme de conversion de messages flexible est utilisé. Utilisez le HTTPMessageConverter configuré par le système pour analyser, puis liez les données correspondantes à l'objet à retourner.
HttpinputMessage
Cette classe est une abstraction d'un message de demande HTTP dans SpringMVC. Dans la méthode read () de HttpMessageConverter, il existe un paramètre formel de HttpinputMessage, qui est l'abstraction interne du récepteur "Demande" joué par le convertisseur de message de SpringMVC. Le convertisseur de message extrait les messages du "message de demande" en fonction des règles et les convertit en objets déclarés dans le paramètre formel de la méthode.
package org.springframework.http; import java.io.ioexception; import java.io.inputStream; interface publique httpinputMessage étend httpMessage {inputStream getBody () lance ioException;}HttpoutputMessage
Dans la méthode écrite () de HttpMessageConverter, il existe un paramètre formel de HttpOutputMessage, qui est l'abstraction interne du récepteur "Message de réponse" utilisé par le convertisseur de message de SpringMVC. Le convertisseur de message écrit le "message de réponse" dans le message de réponse selon certaines règles.
package org.springframework.http; import java.io.ioexception; import java.io.outputStream; interface publique httpOutputMessage étend httpMessage {outputStream getBody () lance ioException;}HttpMessageConverter
/ * * Copyright 2002-2010 L'auteur ou les auteurs originaux. * * Licencié sous la licence Apache, version 2.0 (la "licence"); * Vous ne pouvez pas utiliser ce fichier sauf conforme à la licence. * Vous pouvez obtenir une copie de la licence à * * http://www.apache.org/licenses/license-2.0 * * sauf si la loi applicable ou convenu par écrit, le logiciel * distribué sous la licence est distribué sur une base "en tant que", * sans garantie ou conditions de toute nature, exprimée ou impliquée. * Voir la licence pour la langue spécifique régissant les autorisations et les * limitations sous la licence. * / package org.springframework.http.converter; import java.io.ioexception; import java.util.list; import org.springframework.http.httpinputMessage; Interface httpMessageConverter <T> {boolean canread (class <?> Clazz, mediaType mediaType); Boolean CanWrite (classe <?> Clazz, MediaType MediaType); List <diasyType> GetSupportedMeAyPes (); T Lead (classe <? Étend T> Clazz, httpinputMessage InputMessage) lève IOException, httpMessageNotReadableException; Void Write (T T, MediaType ContentType, HttpOutputMessage OutputMessage) lève IOException, httpMessagenotWitableException;}L'interface HTTPMessageConverter fournit 5 méthodes:
Les paramètres des méthodes de lecture et d'écriture incluent respectivement les objets httpinputMessage et HttpOutputMessage. Ces deux objets représentent respectivement les parties de demande et de réponse dans une communication HTTP. Le flux d'entrée et le flux de sortie correspondants peuvent être obtenus via la méthode Getbody.
Actuellement, il y a beaucoup de convertisseurs fournis par défaut au printemps, notamment:
| nom | effet | Prise en charge de la lecture MediaType | Écrire Support MediaType |
|---|---|---|---|
| BytearrayhttpMessageConverter | Conversion des données et des tableaux d'octets | / / | application / trace d'octet |
| StringHttpMessageConverter | Conversion des données et des types de chaînes | texte/* | texte / plaine |
| Forhttpmessageconverter | Conversion de la forme et du multivalemap <string, string = ""> | application / x-www-forme-urlencod | application / x-www-forme-urlencod |
| SourcehttpMessageConverter | Transform.source Conversion des données et javax.xml.transform.source | texte / xml et application / xml | texte / xml et application / xml |
| MarshallinghttpMessageConverter | Convertir les données XML à l'aide de Springmarshaller / Unmarshaller | texte / xml et application / xml | texte / xml et application / xml |
| MappingJackson2httpMessageConverter | Convertir les données JSON à l'aide d'ObjectMapper de Jackson | Application / JSON | Application / JSON |
| Mappingjackson2xmlhttpMessageConverter | Convertir les données XML à l'aide de XMLMapper de Jackson | Application / XML | Application / XML |
| BufferedImageHttpMessageConverter | Conversion des données et java.awt.image.bufferedImage | Tous les types pris en charge par l'API Java I / S | Tous les types pris en charge par l'API Java I / S |
HttpMessageConverter Matching Process:
@Requestbody Annotation: Selon le type de contenu de type de contenu de la partie d'en-tête de l'objet de demande, faites correspondre le HTTPMessageConverter approprié un par un pour lire les données.
objet privé ReadWithMessageConverters (méthodeParameter MethodParam, httpinputMessage inputMessage, class Paramtype) lève exception {mediaType contenuType = inputMessage.GetHeaders (). GetContentType (); if (contentType == null) {stringBuilder builder = new StringBuilder (classutils.getShortName (méthodeParam.getParameterType ())); String paramname = méthodeParam.getParameTameName (); if (paramname! = null) {builder.append (''); builder.append (paramname); } Jetez un nouveau httpmediaTypenotsUpporTedException ("Impossible d'extraire le paramètre (" + builder.toString () + "): aucun type de contenu trouvé"); } List <MediaType> allSupportEdMediaTypes = new ArrayList <AdiaType> (); if (this.MessageConverters! = null) {for (httpMessageConverter <?> MessageConverter: this.MessageConverters) {allSupportedMediaTypes.Addall (MessageConverter.getsupportedMeAyPes ()); if (MessageConverter.canRead (paramtype, contentType)) {if (logger.isdebugeNable ()) {Logger.debug ("Reading [" + paramtype.getName () + "] as /" "+ ContentType +" / "Using [" + MessageConverter + "]"); } return messageConverter.read (paramtype, inputMessage); }}} Throw New HttpmediaTyPenotsUpporTedException (ContentType, AllsupportEdMediaTyPes); } @ResponseBody Annotation: Selon l'attribut Accept (séparé) de la partie d'en-tête de l'objet de demande, un par un, et traversez le HttpMessageConverter qui peut être traité.
private void writewithMessageConverters (objet returnValue, httpinputMessage inputMessage, httpOutputMessage outputMessage) lève ioException, httpmediaTyEpenotAcceptableException {list <diadiaType> acceptéMeDeAyPes = inputMessage.Getheders (). Getaccept ();); if (acceptedmediaTypes.iSempty ()) {acceptedmediaTypes = Collection.SingletonList (mediaType.all); } MediaType.SortByqualityValue (AcceptedMediaTypes); Class <?> ReturnValutype = returnValue.getClass (); List <diasyType> allSupporTedMeaTypes = new ArrayList <AdiaType> (); if (getMessageConverters ()! = null) {for (mediaType acceptedmediaType: acceptedmediaTypes) {for (httpMessageConverter messageConverter: getMessageConverters ()) {if (messageConverter.CanWrite (returnValueType, acceptédMeattyype)) { MessageConverter.Write (returnValue, AcceptedMediaType, OutputMessage); if (logger.isdebugeNabled ()) {mediaType contentType = outputMessage.GetHeaders (). getContentType (); if (contentType == null) {contentType = acceptedmediaType; } logger.debug ("écrit [" + returnValue + "] as /" "+ contentType +" / "en utilisant [" + MessageConverter + "]"); } this.ResponSEargumentUsedUsed = true; retour; }}} pour (httpMessageConverter MessageConverter: MessageConverters) {allSupportedMediaTypes.Addall (MessageConverter.getsupportedMeAyPes ()); }} lance un nouveau httpmediaTyEpenotaCceptableException (allSupportEdMediaTypes); }Personnaliser un convertisseur JSON
classe CustomJSonHttpMessageConverter implémente httpMessageConverter {// json's json mapping class private objectMapper mapper = new ObjectMapper (); // Le type de support de ce convertisseur: application / JSON Private List supportEdMeaTypes = arrays.aslist (mediaType.Application_json); / ** * Déterminez si le convertisseur peut convertir le contenu d'entrée en type Java * @param Clazz Java Type qui doit être converti * @param mediatype mediaType pour cette demande * @return * / @Override public boolean canread (class cllazz, mediatype mediatype) {if (mediaType == Null) {return true; } pour (MediaType SupportEdMediaType: getSupportEdMeDiaTypes ()) {if (supportDediaType.includes (mediaType)) {return true; }} return false; } / ** * Déterminez si le convertisseur peut convertir les types Java en contenu de sortie spécifié * @param Clazz le type Java qui doit être converti * @param mediatype mediaType pour cette demande * @return * / @Override public Boolean canWrite (class Clazz, mediatype mediatype) {if (mediatype == null || MediaType.all.equals (mediaType)) {return true; } pour (MediaType SupportEdMediaType: getSupportEdMeDiaTypes ()) {if (supportDediaType.includes (mediaType)) {return true; }} return false; } / ** * Obtenez MediaType pris en charge par ce convertisseur * @return * / @Override Public List GetSupportEdMediaTypes () {return SupportEdMediaTypes; } / ** * Lisez le contenu de la demande et convertissez le JSON en un objet Java * @param clazzer le type java qui doit être converti * @param entrée de demande de la demande * @return * @throws ioException * @throws httpMessageNotReadableException * / @Override Object Read (Class Clazz, httpinputMessage FracturedMessage) HttpMessageNotReadableException {return mapper.readvalue (inputMessage.getBody (), Clazz); } / ** * Convertir l'objet Java en JSON pour retourner le contenu * @param o objet qui doit être converti * @param contentType RETOUR type * @param outputMessage Receipt Object * @Throws ioException * @throws httpMessagenotWitableException * / @Override public Void Write (Object O, mediaType ContentType, HTTPUTPUTMUTMESSAGE) IoException, httpMessageNotWitableException {mAper.WriteValue (outputMessage.getBody (), o); }}Personnaliser MappingJackson2HttpMessage
Il peut être vu à partir de la méthode d'écriture dans la classe parent abstracthTTPMessageConverter de MappingJackson2HttpMessageConverter que la méthode écrit des données sur le flux de sortie qui renvoie le résultat via la méthode WriteInternal, donc vous n'avez besoin que de remplacer la méthode:
@BeanPublic MappingJackSon2HttpMessageConverter MappingJackSon2HttpMessageConverter () {Return New MappingJackSon2HttpMessageConverter () {// Réécriture de la méthode WriteInternal et de l'objet HTTPORT @OVERRIDE PROTÉCÉ OutputMessage) lève IOException, httpMessageNotWitableException {// Utilisez ObjectMapper de Jackson pour convertir les objets Java en json string objectMapper Mappen = new ObjectMapper (); String JSON = mAper.WriteValueAsString (Object); Logger.Error (JSON); // Crypt STRING Result = JSON + "Encrypted!"; Logger.Error (résultat); // output outputMessage.getBody (). Write (result.getBytes ()); }};} Après cela, vous devez configurer ce convertisseur personnalisé en printemps. Ici, vous ajoutez un convertisseur personnalisé en réécrivant la méthode ConfigureMessageConverters dans webmvcConfigurer:
// Ajouter un convertisseur personnalisé @OverRidePublic void configureMessageConverters (list <httpMessageConverter <? >> convertisseurs) {converters.add (mappingjackson2httpmessageConverter ()); super.configureMessageConverters (convertisseurs);}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.