لماذا:
لماذا تستخدم AOP لتحقيق التحقق؟
إجابة:
لدى Spring MVC آلية التحقق الخاصة به valid + bindingResult ، ولكن يجب أن يتلقى هذا التنفيذ الافتراضي BindingResult في طريقة وحدة التحكم لأداء التحقق.
على سبيل المثال:
if (result.haserrors ()) {list <ObjectError> allerrors = result.getAllerRors () ؛ قائمة <Tring> errorlists = new ArrayList <> () ؛ لـ (ObjectError ObjectError: allerrors) {errorlists.add (ObjectError.getDefaultMessage ()) ؛ }}احصل على قوائم الخطأ. إذا تم تنفيذ ذلك ، فيجب استدعاء كل طريقة تتطلب التحقق بشكل متكرر ، حتى لو كانت مغلفة.
ربما لا يمكن أن يشير البيان أعلاه إلى تنفيذ SPRING Valid + BindingResult. اسمحوا لي أن أعطيك "الكستناء".
1. الكستناء (النسخة القديمة)
1.1 طبقة الواجهة (Idal)
على سبيل المثال: طلب نشر بسيط ، يتلقى requestbody بيانات الطلب ، valid + bindingResult يؤدي التحقق
responseBodyPoStMapping ("body") public reponsevo bodypost (requestbodyvalid testvo body ، bindingresult result) {// check error if (result.haserrors ()) {list <BomberRor> allerrors = result.getAllerRors () ؛ قائمة <String> قوائم = new ArrayList <> () ؛ لـ (ObjectError ObjectError: allerrors) {lists.add (ObjectError.getDefaultMessage ()) ؛ } إرجاع استجابة جديدة (httpstatus.bad_request.value () ، "المعلمة فارغة" ، قوائم) ؛ } إرجاع استجابة جديدة (httpstatus.ok.value () ، "bodypost" ، null) ؛}1.2 محتوى التحقق من الكيان (VO)
يحتوي Valid + BindingResult على الكثير من شرح التعليقات التوضيحية ، ويمكنك العثور عليه بمجرد لمسه عبر الإنترنت!
الفئة العامة testvo {getTerTerTer @min (value = 0 ، message = "request parameter لا يمكن أن يكون isString أقل من 0") عدد صحيح خاص ؛ getTerTerTer @notblank (message = "request لا يمكن أن يكون isString فارغًا")1.3 اختبار النتائج
2. التحقق من AOP (نسخة ترقية)
يمكن ملاحظة أنه إذا كانت هناك حاجة إلى فحص أجسام متعددة مثل bodypost ، فيجب إعادة إنتاج قطعة من الكود بشكل مستمر. حتى لو تم تغييره إلى طريقة قابلة لإعادة الاستخدام من فئة الوالدين ، فيجب أن يطلق عليها. لذلك ما زلت أشعر أنه ليس أنيقًا بعد التفكير في الأمر. لذلك هناك AOP للتحقق من القسم.
2.1 طبقة الواجهة (Idal)
نعم! قرأت ذلك بشكل صحيح ، انتهى الرمز أعلاه ، وليس هناك حاجة للاتصال بالطريقة المشتركة لفئة الأصل. يتم التعليق التوضيحي الوحيد: paramvalid
@paramvalid@reponseBody@postmapping ("body") public reponsevo bodypost (@requestbodyvalid testvo body ، bindingResult result) {return new reponsevo ("bodypost" ، null) ؛}2.2 شرح مخصص
هذا التعليقات التوضيحية هو أيضا شرح توضيحي طريقة بسيطة.
target (elementType.method) @repinention (attreentionpolicy.runtime) public interface paramvalid {}2.3 النقاط الرئيسية! تنفيذ الجانب
شرح مفصل للقسم:
before: استخدم طريقة التعليقات التوضيحية @annotation (xx) ، وسيتم استدعاء هذه الطريقة كلما استخدمت التعليق التوضيحي المطلوب (paramvalid).
JoinPoint: احصل على معلمات الطريقة من خلال JoinPoint للحصول على المحتويات التي تم التحقق منها بواسطة BindingResult
Migrate التحقق من حزمة التحقق: قم بترحيل التحقق الأصلي إلى جانب: ValiverRequestParams
نتائج التحقق من الاستجابة:
@Side@componentpublic class paramvalidaspect {private static final logger log = loggerFactory.getLogger (paramvalidaspect.class) ؛ before ("@enrotation (paramvalid)") public void paramvalid (Joinpoint point ، paramvalid paramvalid) {object [] paramobj = point.getArgs () ؛ if (paramobj.length> 0) {if (paramobj [1] easuleof bindingResult) {bindingResult result = (bindingResult) paramobj [1] ؛ Responsevo errormap = this.validRequestParams (النتيجة) ؛ if (errormap! = null) {servletRequestAttributes res = (servletRequestatTributes) requestContextholder.getRequestAttributes () ؛ httpservletresponse استجابة = res.getResponse () ؛ استجابة. setcharacterencoding ("UTF-8") ؛ desponse.setContentType (mediaType.application_json_utf8_value) ؛ review.setStatus (httpstatus.bad_request.value ()) ؛ OutputStream Output = null ؛ حاول {output = response.getOutputStream () ؛ errormap.setCode (null) ؛ خطأ في السلسلة = جديد gson (). tojson (errorMap) ؛ log.info ("AOP Parameter غير منتظم" + خطأ) ؛ output.write (error.getBytes ("utf-8")) ؛ } catch (ioException e) {log.error (e.getMessage ()) ؛ } أخيرًا {try {if (output! = null) {output.close () ؛ }} catch (ioException e) {log.error (e.getMessage ()) ؛ }}}}}}}} / *** التحقق* / private responsevo validRequestParams (bindingResult result) {if (result.haserrors ()) {list <Homeberror> allerrors = result.getAllerRors () ؛ قائمة <String> قوائم = new ArrayList <> () ؛ لـ (ObjectError ObjectError: allerrors) {lists.add (ObjectError.getDefaultMessage ()) ؛ } إرجاع استجابة جديدة (httpstatus.bad_request.value () ، "المعلمة فارغة" ، قوائم) ؛ } إرجاع فارغ ؛ }}2.4 نتائج الاختبار
بعد قراءة النتيجة أعلاه ، يمكنك مقارنة مزايا استخدام Spring AOP مع Valid + BindingResult للتحقق:
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.