Creo que los desarrolladores que han usado la primavera han usado @RequestBody y @ResponseBody Annotations, y pueden analizar directamente la entrada en JSON y la salida a JSON. Sin embargo, las solicitudes y respuestas HTTP están basadas en texto, lo que significa que el navegador y el servidor se comunican intercambiando texto original, y esto es en realidad httpmessageConverter desempeñando un papel.
HttpmessageConverter
El paquete de respuesta de solicitud HTTP es en realidad una cadena. Cuando el mensaje de solicitud se ingresa en un programa Java, se encapsulará en una transmisión ServletInputStream. El desarrollador leerá el mensaje, y el paquete de respuesta generará el paquete de respuesta a través de la transmisión ServletOutputStream.
Solo el paquete de cadena original se puede leer desde la transmisión, y lo mismo es cierto para la transmisión de salida. Luego, cuando el mensaje llega a SpringMVC/Springboot y sale de SpringMVC/SpringBoot, hay un problema de convertir cadenas a objetos Java. Este proceso, en SpringMVC/SpringBoot, se resuelve a través de httpmessageConverter. HttpMessageConverter Interface Código fuente de la interfaz:
interfaz pública httpmessageConverter <t> {boolean Canread (class <?> Clazz, Mediatype Mediatype); Boolean CanWrite (clase <?> Clazz, Mediatype Mediatype); Lista <Mediatype> GetSupportedMediatyPes (); T read (clase <? Extiende t> clazz, httpinputMessage inputMessage) lanza ioexception, httpmessageNotreadableException; Void Write (T T, Mediatype ContentType, httpoutputMessage outputMessage) lanza ioexception, httpmessagenotwritableException;}Aquí hay un ejemplo para ilustrar,
@RequestMapping ("/test")@ResponseBodyPublic String test (@RequestBody String Param) {return "param '" + param + "'";}Antes de que la solicitud entre en el método de prueba, la clase de implementación HTTPMessageConverter correspondiente se seleccionará de acuerdo con la anotación @RequestBody para analizar los parámetros de solicitud en la variable Param. Debido a que los parámetros aquí son de cadena, la clase StringHttpMessageConverter se usa aquí. El método Canread () devuelve verdadero, y luego el método Read () leerá los parámetros de solicitud de la solicitud y se unirá a la variable Param del método test ().
Del mismo modo, cuando se ejecuta el método de prueba, ya que el valor de retorno identifica @ResponseBody, SpringMVC/SpringBoot usará el método Write () de StringHttpMessageConverter y escribirá el resultado como un valor de cadena para el mensaje de respuesta. Por supuesto, el método CanWrite () devuelve verdadero en este momento.
Pida prestada la siguiente figura para describir brevemente todo el proceso:
Durante el procesamiento de primavera, un mensaje de solicitud y un mensaje de respuesta se abstraen en un mensaje de solicitud httpinputMessage y un mensaje de respuesta httpoutputMessage, respectivamente.
Al procesar una solicitud, el convertidor de mensajes apropiado vincula el mensaje de solicitud en un objeto de parámetro formal en el método. Aquí, puede haber múltiples formularios de mensajes diferentes en el mismo objeto, como JSON y XML. Lo mismo es cierto para responder a las solicitudes.
En primavera, para diferentes formularios de mensajes, existen diferentes clases de implementación de HTTPMessageConverter para manejar varios formularios de mensajes. En cuanto a las diferentes implementaciones de diversos mensajes de análisis, se encuentran en diferentes clases de implementación de HttpMessageConverter.
Reemplace el httpmessageConverter predeterminado de @ResponseBody
Aquí hay un ejemplo de Springboot. En SpringMVC/SpringBoot, la anotación @RequestBody usa Jackson para analizar JSON de forma predeterminada. Vea el siguiente ejemplo:
@Controlador @requestmapping ("/user") public class UserController {@RequestMapping ("/testtt") @ResponseBody Public User testTT () {user User = new User ("name", 18); devolver el usuario; }} Usuario de clase pública {Nombre de usuario de cadena privada; edad de entero privado; teléfono entero privado; correo electrónico de cadena privada; Usuario público (String UserName, Integer Age) {super (); this.Username = UserName; this.age = edad; }}El acceso del navegador /usuario /testt devuelve de la siguiente manera:
Este es el resultado del uso de Jackson. Ahora lo cambiaremos a usar el objeto de análisis de FastJson. Aquí reemplazamos el httpmessageConverter predeterminado, lo que significa usar fastjsonhttpMessageConverter para manejar la conversión entre los objetos Java y HttpinputMessage/httpoutputMessage.
Primero, cree una nueva clase de configuración para agregar FastJSONHTTPMessageConverter de configuración. Spring 4.x recomienda usar el método de anotación de configuración Java, es decir, no hay archivo XML, y SpringBoot es aún más.
import com.alibaba.fastjson.serializer.serializerFeature; import com.alibaba.fastjson.support.config.fastjsonconfig; import org.springframework.boot.autoconfigure.web.httpmessageConverters; import org.springframework.context.annotation.bean; import og.springframework.context.annotation.configuration; import og.springFrameWork.http.converter.htTpMess java.nio.charset.charset; @ConfigurationPublic Public Class HttpMessageConverterConfig {// Introducir a FastJson para analizar JSON, no use el Jackson predeterminado // El paquete fastjson jar debe introducirse en pom.xml, y la versión debe ser mayor que 1.2.10 @Bean htttpMessageConverters FastJSeshttttttttttttttttttttttttttttTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT {// 1. Defina un objeto que convierte el mensaje FastJSONHTTPMessageConverter FastConverter = new FastJSONHTTPMessageConverter (); // 2. Agregue la información de configuración de FastJson FastJSONConfig FastJSONConfig = new FastJSONConfig (); SerializerFeature [] SerializerFeatures = new SerializerFeature [] {// La clave de salida es una cita doble // SerializerFeature.quotefieldnames, // si para emitir un campo como nulo, si es nulo, el campo se muestra // SerializerFeature.writeMapnullValValue, // si el número numérico es el campo, el campo se muestra 0 de la salida. SerializerFeature.writeNullNumberAszero, // Si el campo de la lista es nulo, la salida es [], no nulo SerializerFeature.WriteNullListAsEmpty, // Si el campo de tipo de carácter es NULL, la salida "", no NULL SerializerFeature.WriteNullStringasEpty, // Si el campo boolean es NULL, la salida, la salida, la producción es falsa, no nace, prevalece la venta, la producción es falsa, no nace, la producción, la producción, la producción, la producción, la producción, no nullul SerializerFeature.WriteNullBooleanAsfalse, // Converter de fecha SerializerFeature.WritedateDateAnFormat, // Circular Reference SerializerFeature.DisableCircularReferEdectEntect,}; FastJSONConfig.SetSerializerFeatures (SerializerFeatures); FastJSONConfig.SetcharSet (charset.forname ("utf-8")); // 3. Agregar información de configuración en convertir FastConverter.setFastJSONConfig (FastJSONConfig); // 4. Agregar convertir a convertir httpmessageConverter <?> convertidor = fastConverter; devolver nuevo httpMessageConverters (convertidor); }}Aquí, si el valor del tipo de cadena es nulo, devolverá "", si el valor de NULL, devolverá 0, reiniciará la aplicación, accede a la interfaz /User /Testt nuevamente y volverá como sigue:
Puede ver que NULL se convierte en "" o 0 en este momento.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.