أعتقد أن المطورين الذين استخدموا Spring قد استخدموا requestbody و @ResponseBody ، ويمكنهم تحليل المدخلات في JSON والمخرجات مباشرة إلى JSON. ومع ذلك ، فإن طلبات HTTP والاستجابات تعتمد على النص ، مما يعني أن المتصفح والخادم يتواصلان من خلال تبادل النص الأصلي ، وهذا هو في الواقع httpmessageconverter يلعب دورًا.
httpmessageconverter
حزمة استجابة طلب HTTP هي في الواقع سلسلة. عند إدخال رسالة الطلب في برنامج Java ، سيتم تغليفها في دفق ServleTinputStream. سيقوم المطور بقراءة الرسالة ، وستقوم حزمة الاستجابة بإخراج حزمة الاستجابة من خلال دفق ServleTOutputStream.
يمكن قراءة حزمة السلسلة الأصلية فقط من الدفق ، وينطبق الشيء نفسه على دفق الإخراج. ثم عندما تصل الرسالة إلى SpringMVC/Springboot وتخرج من springmvc/springboot ، هناك مشكلة في تحويل السلاسل إلى كائنات Java. يتم حل هذه العملية ، في springmvc/springboot ، من خلال httpmessageConverter. HTTPMESSAGECONVERTER INTERCE CODER:
الواجهة العامة httpmessageConverter <T> {boolean canread (class <؟> clazz ، mediaType MediaType) ؛ Boolean Canwrite (Class <؟> clazz ، mediaType MediaType) ؛ قائمة <MediaType> getSupportedMediAtypes () ؛ ر قراءة (فئة <؟ تمتد t> clazz ، httpinputmessage inputMessage) يلقي ioexception ، httpmessagenotreadableable ؛ void write (t t ، mediaType contentType ، httpoutputmessage outputMessage) يلقي iOexception ، httpmessagenotwithablexception ؛}هنا مثال لتوضيح ،
requestmapping ("/test")@reponseBodyPublic Test (requestbody String param) {return "param '" + param + "'" ؛}قبل أن يدخل الطلب في طريقة الاختبار ، سيتم تحديد فئة تنفيذ HTTPMESSAGECONVERTER المقابلة وفقًا لشرح @REQUESTBODY لتحليل معلمات الطلب في متغير Param. نظرًا لأن المعلمات هنا من السلسلة ، يتم استخدام فئة StringHttpMessageConverter هنا. تُرجع طريقة CanRead () بشكل صحيح ، ثم ستقرأ طريقة Read () معلمات الطلب من الطلب وتربط مع متغير Param لطريقة Test ().
وبالمثل ، عندما يتم تنفيذ طريقة الاختبار ، نظرًا لأن قيمة الإرجاع تحدد ResponseBody ، ستستخدم SpringMVC/Springboot طريقة الكتابة () من stringhttpmessageconverter وكتابة النتيجة كقيمة سلسلة إلى رسالة الاستجابة. بالطبع ، تعيد طريقة Canwrite () صحيحًا في هذا الوقت.
استعارة الشكل التالي لوصف العملية بأكملها بإيجاز:
أثناء معالجة الربيع ، يتم استخلاص رسالة طلب ورسالة استجابة في رسالة طلب httpinputmessage ورسالة استجابة httpoutputmessage ، على التوالي.
عند معالجة الطلب ، يقوم محول الرسالة المناسب بربط رسالة الطلب في كائن معلمة رسمي في الطريقة. هنا ، قد يكون هناك نماذج رسائل مختلفة متعددة في نفس الكائن ، مثل JSON و XML. وينطبق الشيء نفسه على الرد على الطلبات.
في الربيع ، بالنسبة لنماذج الرسائل المختلفة ، هناك فئات تنفيذ HTTPMESSAGECONVERTER مختلفة للتعامل مع نماذج الرسائل المختلفة. أما بالنسبة للتطبيقات المختلفة لمختلف الرسائل ، فهي في فئات تنفيذ HTTPMessageConverter مختلفة.
استبدل httpmessageConverter الافتراضي لـ reponseBody
هنا مثال على سبرينغ بوت. في springmvc/springboot ، يستخدم requestbody تعليق جاكسون لتحرير JSON بشكل افتراضي. انظر المثال التالي:
@controller @requestMapping ("/user") الفئة العامة USERCONTROLLER {REQUESTMAPPING ("/testt") @Responsebody user testt () {user user = new user ("name" ، 18) ؛ إرجاع المستخدم ؛ }} مستخدم الفئة العامة {private string username ؛ عصر عدد صحيح خاص ؛ هاتف عدد صحيح ؛ البريد الإلكتروني الخاص بالسلسلة الخاصة ؛ المستخدم العام (اسم المستخدم ، عصر الصدفة) {super () ؛ this.username = اسم المستخدم ؛ this.age = العمر ؛ }}إرجاع الوصول /المستخدم /اختبار المتصفح على النحو التالي:
هذا هو نتيجة استخدام تحليل جاكسون. الآن سنقوم بتغييره إلى استخدام كائن تحليل Fastjson. هنا نستبدل httpmessageConverter الافتراضي ، مما يعني استخدام fastjsonhttpmessageconverter للتعامل مع التحويل بين كائنات Java و httpinputmessage/httpoutputmessage.
أولاً ، قم بإنشاء فئة تكوين جديدة لإضافة تكوين fastjsonhttpmessageConverter. توصي Spring 4.x باستخدام طريقة شرح تكوين Java ، أي أنه لا يوجد ملف XML ، وينبربوت هو أكثر من ذلك.
استيراد com.alibaba.fastjson.serializer.serializerfeature ؛ استيراد com.alibaba.fastjson.support.config.fastjsonconfig ؛ استيراد com.alibaba.fastjson.support.spring.fastjsonhttpmessageconverter ؛ استيراد org.springframework.boot.autoconfigure.web.httpmessageConverters ؛ استيراد org.springframework.context.annotation.bean ؛ استيراد org.springframework.context.annotation.configuration ؛ استيراد org.springframework.http.converter.httpmessageConverter ؛ import java.nio.charset.charset ؛ configurationpublic class httpmessageConverterTerConfig {// تقديم fastjson لتحليل json ، من 1.2.10 bean public httpmessageconverters fastjsonhttpmessageConverters () {// 1. تحديد كائن يحول الرسالة fastjsonhttpmessageConverter fastConverter = جديد fastjsonhttpmessageConverter () ؛ // 2. إضافة معلومات تكوين fastjson fastjsonconfig fastjsonconfig = جديد fastjsonconfig () ؛ SerializerFeature [] serializizerFeatures = new SerializerFeature [] {// مفتاح الإخراج هو اقتباس مزدوج // serializerfeature.quotefieldNames ، // ما إذا كان يجب إخراج حقل كأنه خالية ، إذا كان هذا الخاطف ، يتم عرض الحقل // serializerfeature.writemapnullue ، // serializerfeature.writenullnumberaszero ، // إذا كان حقل القائمة لاغية ، فإن الإخراج هو [] ، وليس null serializerfeature.writenulllistasempty ، // إذا كان حقل الحرف لاغيرًا ، فالإخراج هو "،" ، لا يوجد null serializerfeature.writenullstringasepty ، // / SerializerFeature.WritenullBooleanasfalse ، // Date Converter SerializerFeature.WritedateusedAteFormat ، // Circular Reference SerializerFeature.DisableCircularReferenceEct ،} ؛ fastjsonconfig.SetSerializerFeatures (SerializerFeatures) ؛ fastjsonconfig.setcharset (charset.forname ("utf-8")) ؛ // 3. إضافة معلومات التكوين في تحويل FastConverter.setfastjsonconfig (fastjsonconfig) ؛ // 4. إضافة تحويل إلى تحويل httpmessageConverter <؟> converter = fastConverter ؛ إرجاع httpmessageConverters جديد (محول) ؛ }}هنا ، إذا كانت قيمة نوع السلسلة فارغة ، فسيتم إرجاعها "" ، إذا كانت قيمة NULL ، فسيتم إرجاعها 0 ، وإعادة تشغيل التطبيق ، والوصول إلى واجهة /user /testt مرة أخرى ، والعودة على النحو التالي:
يمكنك أن ترى أنه يتم تحويل Null إلى "" أو 0 في هذا الوقت.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.