В Springmvc вы можете использовать две аннотации @Requestbody и @Responsebody, чтобы завершить преобразование пакетов запроса в объекты и объекты в пакеты ответов, соответственно. Этот гибкий механизм преобразования сообщений используется. Используйте httpmessageconverter, настроенный системой для анализа, а затем свяжите соответствующие данные с объектом, который будет возвращен.
Httpinputmessage
Этот класс является абстракцией сообщения HTTP -запроса в SpringMVC. В методе read () httpmessageconverter существует формальный параметр httpinputmessage, который является внутренней абстракцией рецептора «Сообщение запроса», воспользованное конвертером сообщений Springmvc. Преобразователь сообщений извлекает сообщения из «Сообщения запроса» в соответствии с правилами и преобразует их в объекты, объявленные в формальном параметре метода.
Пакет org.springframework.http; импорт java.io.ioexception; import java.io.inputstream; public interface httpinputmessage extends httpmessage {inputstream getBody () бросает ioException;}Httpoutputmessage
В методе write () httpmessageconverter существует формальный параметр httpoutputmessage, который является внутренней абстракцией рецептора «ответа», используемого конвертером сообщений Springmvc. Преобразователь сообщений записывает «сообщение ответа» в ответное сообщение в соответствии с определенными правилами.
пакет org.springframework.http; import java.io.ioexception; import java.io.outputstream; public interface httpoutputmessage extends httpmessage {outputstream getBody () бросает ioException;}Httpmessageconverter
/ * * Copyright 2002-2010 Оригинальный автор или авторы. * * Лицензирован по лицензии Apache, версия 2.0 («Лицензия»); * Вы не можете использовать этот файл, кроме как в соответствии с лицензией. * Вы можете получить копию лицензии по адресу * * http://www.apache.org/licenses/license-2.0 * *, если не требуется применимый закон или не согласен в письменной форме, программное обеспечение *, распределено по лицензии, распределяется на «как это», * без гарантий или условий любого рода, либо экспрессии, либо подразумевается. * См. Лицензию для конкретного языка, регулирующих разрешения и * ограничения по лицензии. */package org.springframework.http.converter; import java.io.ioexception; импорт java.util.list; import org.springframework.http.httpinputmessage; импорт org.spramework.http.httpoutputmessage; import org.spramework.http.httpoutputmessage; Интерфейс httpmessageconverter <t> {boolean canread (class <?> clazz, mediaType mediaType); Boolean CanWrite (Class <?> Clazz, MediaType MediaType); Список <MediaType> getSupportedMediatypes (); T Read (Class <? Extends T> clazz, httpinputmessage inputmessage) бросает ioexception, httpmessagenotreadableexception; void write (t t, mediaType contentType, httpoutputmessage outputmessage) бросает ioexception, httpmessagenotwritexception;}Интерфейс httpmessageconverter предоставляет 5 методов:
Параметры методов чтения и записи включают HttpinputMessage и HttpoutputMessage, соответственно. Эти два объекта представляют собой части запроса и ответа в связи HTTP соответственно. Соответствующий входной поток и выходной поток могут быть получены с помощью метода Get -Fody.
В настоящее время весной есть довольно много конвертеров, в том числе:
| имя | эффект | Чтение поддержки MediaType | Написать поддержку MediaType |
|---|---|---|---|
| BytearrayhttpmessageConverter | Преобразование данных и массивов байтов | / | Приложение/октет |
| StringhttpmessageConverter | Преобразование данных и типов строк | текст/* | текст/равнина |
| FormhttpmessageConverter | Преобразование формы и мультивалерапа <string, string = ""> | Приложение/X-WWW-FORM-URLENCODED | Приложение/X-WWW-FORM-URLENCODED |
| SourcehttpmessageConverter | Преобразование. | Текст/XML и приложение/XML | Текст/XML и приложение/XML |
| MarshallinghttpmessageConverter | Преобразовать данные XML с использованием Springmarshaller/Unmarshaller | Текст/XML и приложение/XML | Текст/XML и приложение/XML |
| MappingJackson2httpmessageConverter | Преобразовать данные JSON, используя Jackson's ObjectMapper | Приложение/JSON | Приложение/JSON |
| MappingJackson2xmlhttpmessageConverter | Конвертировать данные XML с использованием XMLMapper Джексона | Приложение/XML | Приложение/XML |
| BufferedImagehttpmessageConverter | Преобразование данных и java.awt.image.bufferedImage | Все типы, поддерживаемые Java I/O API | Все типы, поддерживаемые Java I/O API |
HttpmessageConverter Процесс сопоставления:
@Requestbody Annotation: Согласно типу контента типа заголовка объекта запроса, соответствуют соответствующему httpmessageConverter One-Conting для чтения данных.
Частный объект readwithmessageconverters (методпараметров Methodparam, httpinputmessage inputmessage, класс Paramtype) выбрасывает исключение {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 (''); Builder.Append (paramname); } бросить новый httpmediatypenotsupportedException («Невозможно извлечь параметр (" + builder.tostring () + "): не найдено типа контента"); } List <wiseType> allSupportedMediatypes = new ArrayList <MediaType> (); if (this.messageconverters! = null) {for (httpmessageConverter <?> MessageConverter: this.messageConverters) {allSupportedMediatypes.addall (messageConverter.getSupportedIaTypes ()); if (messageconverter.canread (paramtype, contentype)) {if (logger.isdebugenabled ()) {logger.debug («чтение [» + paramtype.getName () + "] as /" " + contentType +" /"" с помощью [" + messageConverter +"] "); } return messageConverter.read (paramtype, inputmessage); }}} бросить новый httpmediatypenotsupportedException (contentType, allSupportedMediatypes); } @ResponseBody Annotation: в соответствии с атрибутом Accept (раздел на запятую) часть заголовка объекта запроса, один за другим, и перемещать, чтобы найти HttpmessageConverter, который может быть обработан.
private void writewithmessageconverters (returnvalue объекта, httpinputmessage inputmessage, httpoutputmessage outputmessage). if (accomtedmediatypes.isempty ()) {accomtedmediatypes = collections.singletonlist (mediaType.all); } MediaType.SortByCalityValue (accesstedMediatypes); Class <?> ReturnValueType = returnValue.getClass (); Список <MediaType> allSupportedMediatypes = new ArrayList <wiestype> (); if (getmessageConverters ()! = null) {for (mediaType acceptmentMediatype: accesstedMediatypes) {for (httpmessageconverter messageconverter: getmessageconverter MessageConverter.Write (returnValue, accesstedMediatype, outputmessage); if (logger.isdebugenabled ()) {mediaType contentType = outputmessage.getheaders (). getContentType (); if (contentType == null) {contentType = accomtedMediatype; } logger.debug ("написано [" + returnValue + "] as /" " + contentType +" /"" с помощью [" + messageConverter +"] "); } this.responseargumentused = true; возвращаться; }}} для (httpmessageConverter messageConverter: messageConverters) {allSupportedMediatypes.addall (messageConverter.getSupportedMediatypes ()); }} бросить новый httpmediatypenotaceptableException (allSupportedMediatypes); }Настроить конвертер JSON
Class CustomJSONHTTPMESSAGECONVERTER Реализует httpmessageconverter {// класс Mass Mapping Jass Json Private ObjectMapper = new ObjectMapper (); // Тип поддержки этого преобразователя: приложение/JSON Private List ProctededIaTypes = Arrays.aslist (mediaType.application_json); / *** Определите, может ли конвертер конвертировать входной контент в тип Java* @param clazz java, который должен быть преобразован* @param mediatype mediatype для этого запроса* @return*/ @override public boolean canread (class clazz, mediaType mediaType) {if (mediaType = null) {return true; } для (MediaType procomededIaType: getSupportedMediatypes ()) {if (proceededMediatype.includes (mediaType)) {return true; }} вернуть false; } / *** Определите, может ли конвертер конвертировать типы Java в указанный выходной контент* @param clazz тип Java, который необходимо преобразовать* @param mediatype mediatype для этого запроса* @return* / @override public boolean canwrite (класс Clazz, MediaType MediaType) {if MediaPe = nullepe. {return true; } для (MediaType procomededIaType: getSupportedMediatypes ()) {if (proceededMediatype.includes (mediaType)) {return true; }} вернуть false; } / ** * Get MediaType, поддерживаемый этим конвертером * @return * / @override public list getopportedMediatyPes () {return proctededIaTypes; } / *** Прочтите содержание запроса и преобразуйте JSON в объект Java* @param clazz тип Java, который необходимо преобразовать* @param inputmessage объект запроса* @return* @throws ioexception* @throws httpmessagenotreadableexcept Httpmessagenotreadableexception {return mapper.readvalue (inputmessage.getbody (), clazz); } / *** Преобразовать объект Java в JSON, чтобы вернуть контент* @param o объект, который необходимо преобразовать* @param contentype type* @param outputmessage объект квитанта* @throws ioexception* @throws httpmessagenotwritexception* / @override public void write (Object O, MediaPepepeTrableExcect IoException, httpmessagenotwritexception {mapper.writevalue (outputmessage.getbody (), o); }}Настройка MappingJackson2httpmessage
Это можно увидеть из метода записи в родительском классе AbstractttpmessageConverter of Mapping Jackson2httpmessageConverter, что метод записывает данные в выходной поток, который возвращает результат с помощью метода записи, поэтому вам нужно только переопределить метод:
@Beanpublic mappingjackson2httpmessageconverter mappingjackson2httpmessageconverter () {return new MappingJackson2httpmessageConverter () {// Перепишите метод записи, объектно -объект, объектный объект, объектный объект, объектный объект, объектный объект, объектный объект, объектный объект, объектный объект, объектный объект, объектный объект, объектный объект, объектный объект, объектный объект, объектный объект, объектный объект, объектный объект. IoException, httpmessagenotwritexception {// Использование объекта Джексона для преобразования Java -объектов в json String objectmapper mapper = new ObjectMapper (); String json = mapper.writevalueasString (Object); Logger.error (json); // зашифровать строку result = json + "incrypted!"; Logger.error (результат); // Выходной outputmessage.getbody (). Write (result.getbytes ()); }};} После этого вам необходимо настроить этот пользовательский преобразователь на пружину. Здесь вы добавляете пользовательский преобразователь, переписывая метод ConfigUremessAgeConverters в WebMVCConfigurer:
// Добавить пользовательский преобразователь @OverridePublic void configureMessageConverters (list <httpmessageConverter <? >> преобразователи) {преобразователи.add (mappingJackson2httpmessageConverter ()); Super.configuremessageConverters (конвертеры);}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.