In SpringMVC können Sie die beiden Anmerkungen @RequestBody und @ResponseBody verwenden, um die Konvertierung von Anforderungspaketen in Objekte und Objekte in Antwortpakete zu vervollständigen. Dieser flexible Nachrichtenkonvertierungsmechanismus wird verwendet. Verwenden Sie den vom System konfigurierten HTTPMessageConverter, um analysiert zu werden, und binden Sie dann die entsprechenden Daten an das zu zurückgegebene Objekt.
HttpinputMessage
Diese Klasse ist eine Abstraktion einer HTTP -Anforderungsnachricht in SpringMVC. In der Read () -Methode von httpMessageConverter gibt es einen formalen Parameter von httpinputMessage, der die interne Abstraktion des Rezeptor -Anforderungsnachrichtes ist, das von SpringMVCs Nachrichtenkonverter von SpringMVC gespielt wurde. Der Nachrichtenkonverter extrahiert Nachrichten aus der "Anforderungsnachricht" gemäß den Regeln und konvertiert sie in Objekte, die im formalen Parameter der Methode deklariert sind.
Paket org.springframework.http; import Java.io.ioxception; importieren java.io.inputStream; öffentliche Schnittstelle httpInputMessage erweitert HttpMessage {InputStream GetBody () Ausläufe IOException;}HttpoutputMessage
In der Write () -Methode von httpMessageConverter gibt es einen formalen Parameter von httpoutputMessage, der die interne Abstraktion der Rezeptor -Antwortmeldung "Antwort" ist, die vom Nachrichtenkonverter von SpringMVC verwendet wird. Der Nachrichtenkonverter schreibt die "Antwortnachricht" gemäß bestimmten Regeln in die Antwortnachricht.
Paket org.springframework.http; importieren java.io.ioxception; import Java.io.outputStream; öffentliche Schnittstelle httpoutputMessage erweitert HttpMessage {outputStream GetBody () Ausläufe IOException;}HttpMessageConverter
/ * * Copyright 2002-2010 Der ursprüngliche Autor oder Autoren. * * Lizenziert unter der Apache -Lizenz, Version 2.0 (die "Lizenz"); * Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden. * Sie können eine Kopie der Lizenz unter * * http://www.apache.org/licenses/license-2.0 * * * *, sofern nach geltendem Recht oder schriftlich gefordert oder schriftlich gefordert wird, Software *, die im Rahmen der Lizenz verteilt ist, auf "As "basis * ohne Gewährleistungen oder Bedingungen jeglicher Art verteilt oder implementiert. * Siehe die Lizenz für die spezifischen Sprachberechtigungen und * Einschränkungen im Rahmen der Lizenz. */Paket org.springFramework.http.converter; import Java.io.ioxception; import Java.util.List ;liste; Schnittstelle httpMessageConverter <T> {boolean canread (Klasse <?> clazz, minyType mediType); Boolean Canwrite (Klasse <?> Clazz, mediType mediType); Liste <MediasType> getSupportedMediTypes (); T Read (Klasse <? Erweitert T> Clazz, httpinputMessage InputMessage) löst IOException, httpMessagenotreadableException aus; void write (t t, minytype contentType, httpoutputMessage outputMessage) löst ioException, httpMessagenotwritable -Exception aus;}Die HTTPMessageConverter -Schnittstelle enthält 5 Methoden:
Die Parameter der Lese- und Schreibmethoden umfassen httpinputMessage- bzw. httpoutputMessage -Objekte. Diese beiden Objekte repräsentieren die Anfrage- und Antwortteile in einer HTTP -Kommunikation. Der entsprechende Eingangsstrom und der Ausgangsstrom können über die GetBody -Methode erhalten werden.
Derzeit werden im Frühjahr standardmäßig viele Konverter zur Verfügung gestellt, darunter:
| Name | Wirkung | Lesen von Unterstützung in MediaPe | Schreiben Sie Support MediaType |
|---|---|---|---|
| BytearrayhttpMessageConverter | Umwandlung von Daten und Byte -Arrays | / | Anwendung/Oktettstrom |
| StringHttpMessageConverter | Konvertierung von Daten- und String -Typen | Text/* | Text/einfach |
| FormHttpMessageConverter | Umwandlung von Form und MultivalUemap <String, String = ""> | Anwendung/x-www-form-urlencoded | Anwendung/x-www-form-urlencoded |
| SourceHttpMessageConverter | Transform.Source Conversion von Daten und javax.xml.transform.source | Text/XML und Anwendung/XML | Text/XML und Anwendung/XML |
| MarshallinghttpMessageConverter | Konvertieren Sie XML -Daten mit Springmarshaller/Unmarshaller | Text/XML und Anwendung/XML | Text/XML und Anwendung/XML |
| Mapingjackson2httpMessageConverter | Konvertieren Sie JSON -Daten mit Jacksons ObjectMapper | Anwendung/JSON | Anwendung/JSON |
| Mapingjackson2xmlhttpMessageConverter | Konvertieren Sie XML -Daten mit Jacksons XMLMapper | Anwendung/XML | Anwendung/XML |
| BufferedimageHttpMessageConverter | Umwandlung von Daten und Java.awt.image.BuffenedImage | Alle Typen, die von Java I/O API unterstützt werden | Alle Typen, die von Java I/O API unterstützt werden |
HttpMessageConverter Matching -Prozess:
@RequestBody Annotation: Entsprechend dem Inhaltstyp des Header-Teils des Anforderungsobjekts den entsprechenden httpMessageConverter nacheinander übereinstimmen, um die Daten zu lesen.
Private Object ReadWithmessageConverters (methodParameter methodparam, httpInputMessage InputMessage, Klasse Paramtype) löst eine Ausnahme aus {mediateType contentType = inputMessage.getheaders (). getContentType (); if (contentType == null) {stringBuilder builder = new StringBuilder (clasutils.getShortName (methodparam.getParameterType ())); String paramname = methodparam.getParametername (); if (paramname! = null) {builder.Append (''); Builder.Append (ParamName); } werfen neue httpMediTypenotsupportededexception ("kann Parameter nicht extrahieren (" + builder.toString () + "): Kein inhalts-Typ gefunden"); } List <Matentype> allsupportedMediTypes = new ArrayList <Diadype> (); if (this.messageConverters! if (messageConverter.canread (paramtype, contentType)) {if (logger.isdebugenabled ()) {logger.debug ("Reading [" + paramtype.getName () + "] as /" + contentType + " /" verwendet [" + messageConverter +"] "). } return messageConverter.read (paramtype, inputMessage); }}} neue httpMediTypenotsupportedexception (contentType, allsupportedMediTypes) werfen; } @ResponseBody Annotation: Gemäß dem Annahmeattribut (Comma-getrennte) des Header-Teils des Anforderungsobjekts einzeln und durchqueren, um den HTTPMessArverter zu finden, der verarbeitet werden kann.
private void write WithmessageConverters (Object ReturnValue, httpinputMessage InputMessage, httpoutputMessage outputMessage) wirft IoException aus, httpmediTypenotacceptableException {list <initialtpe> AcceptediaTypes = InputMessage.GetheSage (). if (AcceptedMediTypes.Isempty ()) {AcceptedMediTypes = Collections.singletonList (mediType.all); } MinyType.sortByQualityValue (AcceptedMediTypes); Class <?> ReturnValUeType = returnValue.getClass (); List <Mentype> allsupportedMediTypes = new ArrayList <Matentype> (); if (getMessageConverters ()! MessageConverter.Write (returnValue, AcceptedMediType, OutputMessage); if (logger.isdebugenabled ()) {mediType contentType = outputMessage.Getheaders (). getContentType (); if (contentType == null) {contentType = AcceptedMediType; } logger.debug ("schriftlich [" + returnValue + "] as /" " + contentType +" /"mit [" + MessageConverter + "]"); } this.responseargumentused = true; zurückkehren; }}} für (httpMessageConverter MessageConverter: MessageConverters) {AllsupportedMediTypes.addall (MessageConverter.getSupportedMediTypes ()); }} werfen neue httpMediTypenotacceptableException (allsupportedMediTypes); }Passen Sie einen JSON -Konverter an
Klasse CustomjsonHttpMessageConverter implementiert httpMessageConverter {// Jacksons JSON -Mapping -Klasse private ObjectMapper mapper = new ObjectMapper (); // Der Support -Typ dieses Konverters: Application/JSON Private List unterstützte mediTypes = arrays.aslist (mediateType.Application_json); / *** Bestimmen Sie, ob der Konverter den Eingangsinhalt in Java -Typen umwandeln kann* @param clazz Java -Typ, der für diese Anfrage konvertiert werden muss. } für (mediType assitedediType: getupportedMediTypes ()) {if (unterstütztMediType.includes (minyType)) {return true; }} return false; } / *** Bestimmen Sie, ob der Konverter Java -Typen in den angegebenen Ausgangsinhalt konvertieren kann. {return true; } für (mediType assitedediType: getupportedMediTypes ()) {if (unterstütztMediType.includes (minyType)) {return true; }} return false; } / ** * GET MITTEILUNG VON DIESER DIESER VERWERTER * @RETURN * / @Override Public List GetSupportedMediTypes () {return unterstütztMediTypes; } / *** Lesen Sie den Anforderungsinhalt und konvertieren Sie den JSON in ein Java -Objekt* @param clazz Der Java -Typ, der konvertiert werden muss HttpMessagenotreadableException {return mapper.readValue (inputMessage.getBody (), Clazz); } / *** Java -Objekt in JSON konvertieren, um Inhalte zurückzugeben* @param o -Objekt, das konvertiert werden muss IoException, httpMessagenotRabitablexception {mapper.writeValue (outputMessage.getBody (), o); }}Passen Sie Mapingjackson2HttpMessage an
Aus der Schreibmethode in der übergeordneten Klasse AbstracthttpMessageConverter von mapingjackson2HttpMessageConverter wird die Methode Daten in den Ausgabestream schreibt, das das Ergebnis über die WriteInternal -Methode zurückgibt. Sie müssen daher nur die Methode überschreiben:
@BeanPublic mapingjackson2HttpMessageConverter mapPingJackson2HttpMessageConverter () {Neue mapingjackson2HttpMessAgeConverter () {// Umgeschrieben das WriteInternal -Methode und das content -@Override -protetierte void -writEnternal -Objekt, das das Content zurückgegeben hat, @Overrided void -Schreibgeschichte (Schreibvorgangs -Objekt. outputMessage) löst IOException aus, httpMessagenotRabitablexception {// Jacksons ObjectMapper verwenden, um Java -Objekte in JSON String ObjectMapper Mapper = new ObjectMapper () umzuwandeln; String json = mapper.writeValueasString (Objekt); Logger.Error (JSON); // String -result = json + "verschlüsselt!"; Logger.Error (Ergebnis); // Ausgabe outputMessage.getBody (). Write (result.getBytes ()); }};} Danach müssen Sie diesen benutzerdefinierten Konverter in den Feder konfigurieren. Hier fügen Sie einen benutzerdefinierten Konverter hinzu, indem Sie die Methode configuremessageConverters in WebMVCConFigurer neu schreiben:
// Fügen Sie einen benutzerdefinierten Konverter hinzu @Overridepublic void configuremessageConverters (Liste <httpMessageConverter <? Super.ConfiguremessageConverters (Konverter);};
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.