مشهد
يواجه فريقنا الآن مشكلة إرساء واجهة البيانات متعددة الطرف. من أجل حل هذه المشكلة ، حددنا مواصفات إرساء الواجهة.
ناقش الواجهة الأمامية (Android ، iOS ، Web Front-End) والخلفية الخلفية مواصفات تنسيق البيانات وحددت تنسيق بيانات JSON:
{"CODE": "200" ، "Data": {"": ""} ، "message": "معالجة بنجاح"} {"Code":يمثل الرمز حالة معالجة الطلب: 200 معالجة عادية ، 300 هو معالجة استثناءات الأعمال ، و 500 هو معالجة استثناء النظام.
تمثل البيانات البيانات التي يتم إرجاعها بواسطة الخلفية.
ستعيد موجه خلفية الرسالة سبب الخطأ عندما يكون طبيعيًا أو ناجحًا.
المشكلة هنا
ألن يكون من المزعج للغاية السماح للجميع بلف قيمة إرجاع كل عرض JSON؟
في هذا الوقت ، سيتم إطلاق AOP. يمكننا استخدام فكرة AOP للفها على طبقة عندما يعود الطلب إلى JSON قبل الرد على العميل.
خطوات التنفيذ
تمكين AOP
<!-الحزمة الأساسية إذا كانت متعددة ، منفصلة مع "،"-> <سياق: مكون المسح الضوئي package = "com.we ، cn.isuyang"> <context: include-filter type = "ensounation" expression = "org.springframework expression = "org.springframework.stereopee.controller" /> < /context: component-scan> <!-فتح التعليق التوضيحي AOP-> <aOP: SideJ-Autoproxy />
إنشاء قسم
/*** json إرجاع الوجه الظانق* <p>* المستخدمة لمعالجة JSON إرجاع النتيجة** Author Zhuangjunxiang ([email protected])* date 28 أبريل 2017* /@component@order (2) class jsonreturnaspect {**. ملف تكوين النظام بشكل افتراضي** param pjp tangent point*/ around (value = "annotation (org.springframework.web.bind.annotation.responsebody)") order (1) الكائنات العامة المشوه (finalingjoinpoint pjp) رمي {كائن قائمة = pjp. if (isReturnVoid (pjp)) {httpservletresponse strax = ((servletRequestatTributes) requestContextholder.getRequestatTributes ()) .getResponse () ؛ if (isNeedWrap (pjp)) {response.getWriter (). الكتابة (jsonutil.tojson (النجاح ("العملية تنجح"))) ؛ } قائمة الإرجاع ؛ } إرجاع البيانات (قائمة) ؛ } / ** * هي الحزمة المطلوبة * * param pjp tangent point * * return true تعني أنه لا توجد حاجة * / isneedwrap boolean الخاصة (protectionopoint propeinpoint pjp) {method method = sideUtil.getMethod (pjp) ؛ إرجاع! method.isannotationpresent (void.class) ؛ } / ** * ما إذا كنت سترجع فارغًا * * param pjp * return true: نوع الإرجاع باطل ، خطأ: نوع الإرجاع ليس باطلاً * / خاصًا بولانيًا isReturnvoid (proseingjoinpoint PJP) class <؟> returntype = method.getReturnType () ؛ إرجاع "void" .equals (returntype.getName ()) ؛ } / *** إرجاع كائن بعد الإنشاء الناجح* <p>* عندما تكون الرسالة فارغة ، لا تتم مطالبة أي مطالبة ، وإذا لم يكن فارغًا ، يتم مطالبتها*** param رسالة نجاح رسالة* @REGAN JSON OBJECT* / Public Static Map <String ، Object> Success (رسالة السلسلة النهائية) {MAP ، كائن> MAP = MAPUTIL.MAP () ؛ map.put ("Code" ، statusCode.Success.Key ()) ؛ map.put ("رسالة" ، رسالة) ؛ map.put ("البيانات" ، ") ؛ إرجاع خريطة ؛} / *** إرجاع كائن بعد البناء الناجح* <p>* عندما تكون الرسالة فارغة ، لا توجد موجه ، ولا توجد موجه فارغ** رسالة نجاح رسالة @param* @كائن json* / public static map <string ، الكائن> البيانات (بيانات الكائن النهائي) {map <string> map = maputil.map () ؛ map.put ("الرسالة" ؛
تحليلها
component هذا التعليق التوضيحي يعني تسليم هذا الكائن إلى حاوية الزنبرك للتثبيت.
Aspect يعني أن هذا فئة وجه
@Around(value = "@annotation(org.springframework.web.bind.annotation.ResponseBody)")
وهذا يعني أن جميع الأساليب مع تعليق @ResponseBody هي النقطة الوسط لهذا القسم ، وبعبارة أخرى ، سيتم اعتراضها.
يلاحظ:
لا يمكن للمعلمة proseingJoinPoint في طريقة WARP استخدام Prosegoinpoint ، فقط من خلال الإخطارات المحيطة.
يمكن لكل نوع نقطة اتصال استدعاء طريقة الوكيل والحصول على وتغيير قيمة الإرجاع. خلاف ذلك ، فهي لاستخدام JoinPoint.
الحالة 1: افترض أن الوظيفة في فئة وحدة التحكم لا تحتاج إلى أي قيمة إرجاع
على سبيل المثال: عندما أقوم بتحديث كائن كيان ، أحتاج فقط إلى إرجاع نتيجة التحديث وهي على ما يرام ، وليس هناك حاجة لملء البيانات.
تنسيق البيانات التي تم إرجاعها:
{"رمز": "200" ، "بيانات": "" ، "رسالة": "معالجة بنجاح"}أفكار التنفيذ:
احصل على نوع قيمة الإرجاع لهذه الوظيفة في وظيفة المعالجة لفئة معالجة الجوانب. إذا كان باطلاً ، فإنه يعيد البيانات بالتنسيق المحدد.
ما سبق isReturnvoid () هو حكم مثل هذا.
تحتاج فقط إلى تغيير قيمة إرجاع الوظيفة إلى باطلة:
@requestmapping@reviewbodypublic void add (matchid ، model model) {slxSignupViewService.setAddinfo (matchid ، model) ؛}الحالة 2: افترض أن قيمة إرجاع الوظيفة في فئة وحدة التحكم لا تحتاج إلى لفها
على سبيل المثال:
تم تحديد قيمة الإرجاع لبعض المكونات الإضافية في الواجهة الأمامية ورسو الطرف الثالث (الدفع).
وتنزيل الملفات ، نحن زائدة عن الحاجة.
أفكار التنفيذ:
تخصيص التعليق التوضيحي لـ @void:
/*** التعليق التوضيحي الفارغ* <p>* يستخدم لتحديد قيمة الإرجاع في طبقة وحدة التحكم كما هو** Author Wangsen ([email protected])* date 17 أغسطس ، 2017*/@target ({elementType.method}) attreenteration police.runtime
أضف هذا التعليق التوضيحي إلى طريقة طبقة وحدة التحكم
/*** مكتملة الدفع*/@void@reponseBody@requestMappingPublic void payfinish () رمي ioException {alipayViewService.payfinish () ؛}تحديد ما إذا كانت هذه الوظيفة تحتوي على هذا التعليق التوضيحي في فئة معالجة هذا القسم.
ثم لن تتم معالجتها والعودة كما هي.
طريقة ISNEEDWRAP () في فئة jsonreturnaspect تتعامل مع هذا المطلب.
لخص
ما سبق هو تحليل لأفكار تطبيق JSON عرض MVC المخصصة التي قدمتها لك. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!