Je crois que les développeurs qui ont utilisé Spring ont utilisé des annotations @Requestbody et @ResponseBody et peuvent directement analyser l'entrée dans JSON et la sortie dans JSON. Cependant, les demandes et les réponses HTTP sont basées sur du texte, ce qui signifie que le navigateur et le serveur communiquent en échangeant du texte d'origine, et c'est en fait httpMessageConverter jouant un rôle.
HttpMessageConverter
Le paquet de réponse de demande HTTP est en fait une chaîne. Lorsque le message de demande est entré dans un programme Java, il sera encapsulé dans un flux ServletinputStream. Le développeur lira le message et le paquet de réponse sortira le paquet de réponse via le flux servletOutputStream.
Seul le paquet de chaîne d'origine peut être lu à partir du flux, et il en va de même pour le flux de sortie. Ensuite, lorsque le message arrive à Springmvc / Springboot et quitte de Springmvc / Springboot, il y a un problème de conversion des chaînes en objets Java. Ce processus, dans SpringMVC / Springboot, est résolu via HttpMessageConverter. HttpMessageConverter Interface Code source:
Interface publique httpMessageConverter <T> {Boolean CanRead (classe <?> 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;}Voici un exemple pour illustrer,
@RequestMapping ("/ test") @ réponse Test de chaîne de réponse (@Requestbody String param) {return "param '" + param + "'";}Avant que la demande entre la méthode de test, la classe d'implémentation HTTPMessageConverter correspondante sera sélectionnée en fonction de l'annotation @Requestbody pour analyser les paramètres de demande dans la variable Param. Parce que les paramètres ici sont de String, la classe StringHttpMessageConverter est utilisée ici. Sa méthode CanRead () renvoie true, puis la méthode read () lira les paramètres de demande de la demande et se liera à la variable param de la méthode test ().
De même, lorsque la méthode de test est exécutée, car la valeur de retour identifie @ResponseBody, Springmvc / Springboot utilisera la méthode écrite () de StringHttpMessageConverter et écrira le résultat en tant que valeur de chaîne dans le message de réponse. Bien sûr, la méthode CanWrite () renvoie vrai pour le moment.
Empruntez le chiffre suivant pour décrire brièvement l'ensemble du processus:
Pendant le traitement du printemps, un message de demande et un message de réponse sont résumés dans un message de demande httpinputMessage et un message de réponse httpoutputMessage, respectivement.
Lors du traitement d'une demande, le convertisseur de message approprié lie le message de demande en un objet de paramètre formel dans la méthode. Ici, il peut y avoir plusieurs formulaires de message différents dans le même objet, tels que JSON et XML. Il en va de même pour répondre aux demandes.
Au printemps, pour différentes formulaires de messages, il existe différentes classes d'implémentation HTTPMessageConverter pour gérer divers formulaires de message. Quant aux différentes implémentations de divers analyses de messages, elles sont dans différentes classes d'implémentation HTTPMessageConverter.
Remplacer HttpMessageConverter par défaut de @ réponse.
Voici un exemple de Springboot. Dans Springmvc / Springboot, l'annotation @Requestbody utilise Jackson pour analyser JSON par défaut. Voir l'exemple suivant:
@ Contrôleur @ requestmapping ("/ user") public class userController {@RequestMapping ("/ testt") @ResponseBody public utilisateur testt () {user user = new user ("name", 18); RETOUR UTILISATEUR; }} Nom d'utilisateur de chaîne privée de classe publique; Âge entier privé; téléphone entier privé; e-mail de chaîne privée; Utilisateur public (nom d'utilisateur de chaîne, âge entier) {super (); this.userName = nom d'utilisateur; this.age = âge; }}Renvoie l'accès / utilisateur / testt du navigateur comme suit:
C'est le résultat de l'utilisation de l'analyse Jackson. Nous allons maintenant le changer en utilisant un objet d'analyse FastJson. Ici, nous remplaçons le HttpMessageConverter par défaut, ce qui signifie l'utilisation de FastJSonHttpMessageConverter pour gérer la conversion entre les objets Java et HttpinputMessage / HttpOutputMessage.
Tout d'abord, créez une nouvelle classe de configuration pour ajouter la configuration FastJSonHttpMessageConverter. Spring 4.x recommande d'utiliser la méthode d'annotation de configuration Java, c'est-à-dire qu'il n'y a pas de fichier XML, et Springboot l'est encore plus.
import com.alibaba.fastjson.serializer.serializerfeature; import com.alibaba.fastjson.support.config.fastjsonconfig; import com.alibaba.fastjson.support.spring.fastjsonhttpmessageconverter; import; org.springframework.boot.autoconfigure.web.httpmessageConverters; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.http.converter.httmessagconverter; java.nio.charset.charset; @configurationpublic class httpMessageConverterConfig {// introduire FastJson à l'analyse JSON, n'utilisez pas le package Jackson // FastJson Jar doit être introduit dans pom.xml, et le désir de version est plus élevé que 1,2.10 @Bean public httageconver FastJSonHttpMessageConverters () {// 1. Définissez un objet qui convertit le message FastJSonHttpMessageConverter FastConverter = new FastJsonHttpMessageConverter (); // 2. Ajoutez des informations de configuration FastJSON FastJSonConfig FastJSonConfig = new FastJsonConfig (); SerializerFeature [] SerializerFeatures = new SerializerFeature [] {// La touche de sortie est une double citation // SerializerFeature.quoteFieldNames, // à produire un champ comme null, s'il est nul SerializerFeature.WritenullNumberaszero, // Si le champ de liste est nul, la sortie est [], pas le champ de type SerializerFeature.WritenullListasEmpty, // Si le champ de type de caractère est nul, la sortie est "", non null serializerFeature.writenullstringasempty, // si le champ boolean est null, la sortie est fausse, ne peut pas nul SerializerFeature.WritenullBooleAnasfalse, // Date Converter SerializerFeature.WRITEDATEUSEATATEFORMAT, // Circular Reference SerializerFeature.DisableCircularRefeRendedEct,}; FastJSonConfig.SetSerializerFeatures (SerializerFeatures); FastJSonConfig.SetchArset (charset.forname ("UTF-8")); // 3. Ajoutez des informations de configuration dans Convert FastConverter.setfastjsonConfig (FastJSonConfig); // 4. Ajoutez converti en converties httpMessageConverter <?> Converter = FastConverter; Renvoie un nouveau HTTPMessageConverters (convertisseur); }}Ici, si la valeur du type de chaîne est nul, elle reviendra "", si la valeur de NULL, il renverra 0, redémarrera l'application, accédez à l'interface / utilisateur / testt et reviendra comme suit:
Vous pouvez voir que Null est converti en "" ou 0 pour le moment.
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.