في springMVC ، يمكنك استخدام اثنين من التعليقات التوضيحية @requestbody و @responsebody لإكمال تحويل حزم الطلب إلى الكائنات والكائن إلى حزم الاستجابة ، على التوالي. يتم استخدام آلية تحويل الرسائل المرنة هذه. استخدم httpmessageConverter التي تم تكوينها بواسطة النظام لتحليلها ، ثم ربط البيانات المقابلة للكائن المراد إرجاعها.
httpinputmessage
هذه الفئة عبارة عن تجريد لرسالة طلب HTTP داخل SpringMVC. في طريقة القراءة () من httpmessageConverter ، هناك معلمة رسمية من httpinputmessage ، وهو التجريد الداخلي لمستقبلات "طلب" التي يتم تشغيلها بواسطة محول رسالة springMVC. يقوم محول الرسائل باستخراج الرسائل من "رسالة الطلب" وفقًا للقواعد ويحولها إلى كائنات معلنة في المعلمة الرسمية للأسلوب.
package org.springframework.http ؛ import java.io.ioException ؛ استيراد java.io.inputstream ؛ الواجهة العامة httpinputmessage تمتد httpmessage
httpoutputmessage
في طريقة الكتابة () من httpmessageConverter ، هناك معلمة رسمية من httpoutputmessage ، وهو التجريد الداخلي لرسالة الاستجابة للمستقبلات المستخدمة من قبل محول رسالة springMVC. يكتب محول الرسالة "رسالة الاستجابة" في رسالة الاستجابة وفقًا لقواعد معينة.
package org.springframework.http ؛ import java.io.ioException ؛ استيراد java.io.outputstream ؛ الواجهة العامة httpoutputmessage تمتد httpmessage
httpmessageconverter
/ * * حقوق الطبع والنشر 2002-2010 المؤلف أو المؤلفين الأصليين. * * مرخصة بموجب ترخيص Apache ، الإصدار 2.0 ("الترخيص") ؛ * لا يجوز لك استخدام هذا الملف إلا في الامتثال للترخيص. * يمكنك الحصول على نسخة من الترخيص على * * http://www.apache.org/licenses/license-2.0 * * ما لم يكن مطلوبًا بموجب القانون المعمول به أو يتم الاتفاق عليه في الكتابة ، يتم توزيع البرمجيات * الموزعة بموجب الترخيص على أساس "كما هو" ، * دون ضمانات أو شروط من أي نوع ، إما صريحة أو ضمنية. * راجع ترخيص الأذونات اللغوية المحددة والقيود * بموجب الترخيص. */package org.springframework.http.converter ؛ import java.io.ioException ؛ import java.util org.springframework.http.mediatepe ؛ الواجهة العامة 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 ؛}توفر واجهة httpmessageconverter 5 طرق:
تتضمن معلمات طرق القراءة والكتابة httpinputmessage و httpoutputmessage ، على التوالي. يمثل هذان الكائنان أجزاء الطلب والاستجابة في اتصال HTTP على التوالي. يمكن الحصول على دفق الإدخال المقابل ودفق الإخراج من خلال طريقة getBody.
حاليًا ، هناك الكثير من المحولات المقدمة بشكل افتراضي في الربيع ، بما في ذلك:
| اسم | تأثير | قراءة الدعم mediaType | اكتب الدعم MediaType |
|---|---|---|---|
| bytearrayhttpmessageConverter | تحويل البيانات ومصفوفات البايت | / | تطبيق/ثماني الثماني |
| StringHttpMessageConverter | تحويل البيانات وأنواع السلسلة | نص/* | نص/عادي |
| formhttpmessageConverter | تحويل النموذج و multivaluemap <string ، string = ""> | التطبيق/x-www-form-urlencoded | التطبيق/x-www-form-urlencoded |
| SourceHttpMessageConverter | تحويل. تحويل البيانات و javax.xml.transform.source | النص/XML والتطبيق/XML | النص/XML والتطبيق/XML |
| marshallinghttpmessageConverter | تحويل بيانات XML باستخدام SpringMarshaller/Unmarshaller | النص/XML والتطبيق/XML | النص/XML والتطبيق/XML |
| MapPingJackson2httpmessageConverter | تحويل بيانات JSON باستخدام Jackson's ObjectMapper | التطبيق/JSON | التطبيق/JSON |
| MapPingJackson2xmlHttpmessageConverter | تحويل بيانات XML باستخدام XMLMapper من Jackson | التطبيق/xml | التطبيق/xml |
| BufferedImageHttpMessageConverter | تحويل البيانات و java.awt.image.bufferedImage | جميع الأنواع التي تدعمها Java I/O API | جميع الأنواع التي تدعمها Java I/O API |
httpmessageConverter عملية مطابقة:
requestbody التعليق التوضيحي: وفقًا لنوع نوع المحتوى لجزء الرأس من كائن الطلب ، قم بمطابقة httpmessageconverter المناسبة واحدة تلو الأخرى لقراءة البيانات.
كائن خاص readWithMessageConverters (MethodParameter methodparam ، httpinputmessage inputMessage ، class paramtype) يلقي الاستثناء {mediaType contentType = inputMessage.getheaders (). getContentType () ؛ if (contentType == null) {StringBuilder Builder = new StringBuilder (classUtils.getShortName (methodparam.getParameterType ())) ؛ سلسلة paramname = methodparam.getParameterName () ؛ if (paramName! = null) {builder.append ('') ؛ builder.append (paramname) ؛ } رمي httpmediatepenotsupportedException ("لا يمكن استخراج المعلمة (" + builder.toString () + "): لم يتم العثور على نوع المحتوى") ؛ } قائمة <MedarType> AllSupportedMediatePes = new ArrayList <DearyType> () ؛ if (this.messageConverters! = null) {for (httpmessageConverter <؟> messageconverter: this.messageConverters) {allsupportededIdiateTypes.addall (messageconverter.getSupportededIdietypes ()) ؛ if (messageConverter.canread (paramtype ، contentType)) {if (logger.isdebugenabled ()) {logger.debug ("reading [ + paramtype.getName () +"] As /" + contentType +" /"use [ +" messageconverter + "]") ؛ } return messageConverter.Read (paramtype ، inputMessage) ؛ }}} رمي httpmediatepenotsupportedexception (contentType ، allsupportedMediatepes) ؛ } التعليق التوضيحي @ResponseBody: وفقًا لسمة قبول (مفصولة الفاصلة) لجزء الرأس من كائن الطلب ، واحدًا تلو الآخر ، وتجتاز العثور على httpmessageConverter الذي يمكن معالجته.
private void writewithmessageConverters (الكائن returnvalue ، httpinputmessage inputmessage ، httpoutputmessage outpressmessage) يلقي ioException ، httpmediatepenotacceptable {list <MediType> accountediatepes = inputmessage.getheaders (). if (accountedMediAtypes.isempty ()) {accountedediatepes = collections.singletonList (mediaType.all) ؛ } mediaType.SortByqualityValue (MongedMediAtypes) ؛ فئة <؟> returnValuEtype = returnValue.getClass () ؛ قائمة <MedarType> AllSupportedMediatePes = new ArrayList <MedarType> () ؛ if (getMessageConverters ()! = null) {for (mediaType accountedMediatePe: accountedMediatepes) {for (httpmessageconverter messageconverter: getMessageConverters ()) {if (messageconverter.canwrite messageConverter.write (returnvalue ، accountedediatepe ، outputMessage) ؛ if (logger.isdebugenabled ()) {mediaType contentType = outputMessage.getheaders (). getContentType () ؛ if (contentType == null) {contentType = accountedMediAtype ؛ } logger.debug ("مكتوب [" + returnValue + "] كـ /" " + contentType +" /"باستخدام [" + messageConverter + "]") ؛ } هذا. يعود؛ }}} لـ (httpmessageconverter messageconverter: messageconverters) {allsupportedMediatePes.addall (messageconverter.getSupportedMediaTypes ()) ؛ }} رمي httpmediatepenotacceptableException (allsupportededistypes) ؛ }تخصيص محول JSON
class customjsonhttpmessageConverter تنفذ httpmessageconverter {// Jackson's Json Class private ObjectMapper mapper = new ObjectMapper () ؛ . / *** حدد ما إذا كان يمكن للمحول تحويل محتوى الإدخال إلى نوع Java* @param clazz java الذي يجب تحويله* param mediaType MediaType لهذا الطلب* @ @rogride public boolean canread (class clazz ، mediaType mediaType) {if (mediaType == null) } لـ (mediaType supportededIdiatepe: getSupportedMediatepes ()) {if (supportedediDiate.includes (mediaType)) {return true ؛ }} إرجاع خطأ ؛ } / *** تحديد ما إذا كان يمكن للمحول تحويل أنواع Java إلى محتوى الإخراج المحدد* param clazz نوع Java الذي يجب تحويله* param mediaType mediaType لهذا الطلب* @return* / ouverride boolean canwrite (class clazz ، mediaType) العودة صحيح. } لـ (mediaType supportededIdiatepe: getSupportedMediatepes ()) {if (supportedediDiate.includes (mediaType)) {return true ؛ }} إرجاع خطأ ؛ } / ** * الحصول على MediaType مدعوم من هذا المحول * regurn * / Override Public List getupportedediatepes () {return supportedediatepes ؛ } / *** اقرأ محتوى الطلب وقم بتحويل JSON إلى كائن Java* param clazz نوع Java الذي يجب تحويله* param request request request* @throws ioexception* thttpintage throseage throsse inportmess throws httpmessagenotReadableException {return mapper.readvalue (inputMessage.getBody () ، clazz) ؛ ستر ioException ، httpmessagenotwithablexception {mapper.writevalue (outputMessage.getBody () ، o) ؛ }}تخصيص MapPingJackson2HttpMessage
يمكن رؤيته من طريقة الكتابة في الفئة الأصل ArtCracthTtpMessageConverter من MapPingJackson2httpMessageConverter أن الطريقة تكتب البيانات إلى دفق الإخراج الذي يرجع النتيجة من خلال طريقة الكتابة ، لذلك تحتاج فقط إلى تجاوز الطريقة:
beanpublic mappingjackson2httpmessageconverter mappingjackson2httpmessageConverter () {return new MapPingJackson2httpMessageConverter () {// إعادة كتابة طريقة الكتابة و encrypt أولاً قبل إرجاع المحتوى المحمي voided يلقي IOException ، httpmessagenotwithablexception {// استخدم Jackson ObjectMapper لتحويل كائنات java إلى json orjectmapper mapper = new ObjectMapper () ؛ String json = mapper.writevalueasString (كائن) ؛ logger.error (json) ؛ // encrypt string result = json + "encrypted!" ؛ logger.error (نتيجة) ؛ // outputmessage.getBody (). write (result.getBytes ()) ؛ }} ؛} بعد ذلك ، تحتاج إلى تكوين هذا المحول المخصص في الربيع. هنا يمكنك إضافة محول مخصص عن طريق إعادة كتابة طريقة configuremessageConverters في WebMVCConfigurer:
// إضافة محول مخصص Overridepublic void configuremessageConverters (قائمة <httpmessageConverter <؟ >> المحولات) {adcondters.add (MapPingJackson2httpMessageConverter ()) ؛ super.configuremessageConverters (المحولات) ؛}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.