مقدمة
عند استخدام springMVC كطبقة وحدة تحكم لتطوير الويب ، من الضروري غالبًا إجراء فحص المعلمة على الطرق في وحدة التحكم. في الأصل ، يأتي springMVC مع اثنين من التعليقات التوضيحية @Valid و @strenoations التي يمكن استخدامها للتحقق من المعلمات ، ولكن لا يمكن فحصها إلا عندما تكون المعلمات فاصوليا. لا ينطبق على سلسلة أو طويلة. في بعض الأحيان تفشل هذان التعليقات التعليقات التوضيحية فجأة (لم يتم التحقيق في الأسباب بعناية). في هذا الصدد ، يمكنك استخدام AOP والتعليقات التوضيحية المخصصة لكتابة وظيفة التحقق من المعلمة بنفسك.
مثال رمز
ملاحظة: الرمز في هذا القسم هو مجرد عرض عرض ، يعطي فكرة ممكنة ، وليس حلًا كاملاً.
هذا المشروع هو مشروع ويب بسيط ، يتم استخدامه: Spring ، SpringMVC ، Maven ، JDK1.8
هيكل المشروع:
التعليقات التوضيحية المخصصة:
ValyParam.java:
package com.lzumetal.ssm.paramcheck.annotation ؛ استيراد java.lang.annotation.*؛/***مشروح على الحبة المعلمة ، مما يشير إلى أن المعلمة يجب التحقق منها*/@target ({elementType.parameter})notnull.java:
package com.lzumetal.ssm.paramcheck.annotation ؛ import java.lang.annotation.*؛@target ({elementType.field ، elementType.Parameter})@entry(retentionpolicy.runtime)@documentedpublic notnull {String msg () default "لا يمكن أن تكون الملفات فارغة" ؛ }notempty.java:
package com.lzumetal.ssm.paramcheck.annotation ؛ import java.lang.annotation.*؛@target ({elementType.field ، elementType.Parameter})@entention(retentionpolicy.runtime)@documentedpublic notempty {String msg () default "لا يمكن أن تكون الملفات فارغة" ؛ } الوجه
paramcheckaspect.java:
package com.lzumetal.ssm.paramcheck.aspect ؛ استيراد com.lzumetal.ssm.paramcheck.annotation.notempty ؛ استيراد com.lzumetal.ssm.paramcheck.annotation.notnull ؛ استيراد com.lzumetal.ssm.paramcheck.annotation.validparam ؛ org.apache.commons.lang3.stringUtils ؛ استيراد org.aspectj.lang.joinpoint ؛ استيراد org.aspectj.lang.annotation.aspect ؛ استيراد org.aspectj.lang.annotation.beore ؛ javax.servlet.http.httpservletrequest ؛ import javax.servlet.http.httpservletresponse ؛ import javax.servlet.http.httpservletrespons java.lang.reflect.parameter ؛ استيراد java.util.arrays ؛/***التحقق من فئة الوجه*/@@@componentpublic class paramcheckaspect {execution ( Object [] args = joinpoint.getargs () ؛ // GET METHORATION PARAMETERS MESTRESIGNATURATURATURATURAUTE SIGNATURE = (METLOMESIGNAUTE) المعلمة [] المعلمات = signature.getMethod (). getParameters () ؛ لـ (int i = 0 ؛ i <parameters.length ؛ i ++) {parameter parameter = parameters [i] ؛ // تتم معالجة أنواع المعلمات الأساسية الخاصة بـ Java (مثل عدد صحيح ، سلسلة) إذا (Isprimite (parameter.gettype ())) {notnull notnull = parameter.getAnnotation (notnull.class) ؛ if (notnull! = null && args [i] == null) {رمي new runTimeException (parameter.toString () + notnull.msg ()) ؛ } // todo متابعة ؛ } /** لا يتم إجراء أي معالجة عندما لا يتم تمييز تعليق توضيحي Validparam ، أو عندما يكون httpservletrequest ، httpservletresponse ، أو httpsession لم يتم القيام به* / if (parameter.gettype (). parameter.gettype (). isAssignableFrom (httpsession.class) ||. } class <؟> paramclazz = parameter.gettype () ؛ // احصل على كائن المعلمة المقابل للنوع. لن تمر الواجهة الموجودة في وحدة التحكم في المشروع الفعلي معلمتين من نفس النوع المخصص ، لذلك استخدم FindFirst () مباشرة هنا. Object arg = arrays.stream (args) .filter (ar -> paramclazz.isassIgnableFrom (ar.getClass ())). findFirst (). get () ؛ // احصل على جميع متغيرات الأعضاء في حقل المعلمة [] معلنفيون = paramclazz.getDeclaredFields () ؛ لـ (حقل الحقل: DESTINGFIELDS) {field.setAccible (true) ؛ // تحقق من الحقول المميزة بـ notnull notnull = field.getAnnotation (notnull.class) ؛ if (notnull! = null) {object fieldValue = field.get (arg) ؛ if (fieldvalue == null) {رمي new runTimeException (field.getName () + notnull.msg ()) ؛ }} // تحقق من الحقول المميزة بشروح notempty ، يتم استخدام notempty فقط على نوع السلسلة notempty notempty = field.getAnnotation (notempty.class) ؛ if (notempty! = null) {if (! string.class.isAssignableFrom (field.gettype ())) {رمي new runTimeException ("التعليقات التوضيحية غير المألوفة باستخدام فئة حقل خاطئ") ؛ } سلسلة fieldstr = (string) field.get (arg) ؛ if (stringUtils.isblank (fieldstr)) {رمي new runTimeException (field.getName () + notempty.msg ()) ؛ }}}}} /** * حدد ما إذا كان نوعًا أساسيًا: بما في ذلك السلسلة * param clazz * @return true: نعم ؛ خطأ: لا */ خاص منطقي Isprimite (فئة <؟> clazz) {return clazz.isprimitive () || clazz == string.class ؛ }} المعلمات javabean
studentparam.java:
package com.lzumetal.ssm.paramcheck.requestparam ؛ استيراد com.lzumetal.ssm.paramcheck.annotation.notempty ؛ استيراد com.lzumetal.ssm.paramcheck.annotation.notnull ؛ studentparam public {notnull private id ؛ عصر عدد صحيح خاص ؛ notempty اسم السلسلة الخاصة ؛ // الحصول على ، تعيين الأساليب المحذوفة ...} وحدة تحكم للتحقق من التحقق من المعلمة
testController.java:
package com.lzumetal.ssm.paramcheck.controller ؛ استيراد com.google.gson.gson ؛ استيراد com.lzumetal.ssm.paramcheck.annotation.notnull ؛ import com.lzumetal.ssm.paramcheck.annotation.validparam ؛ org.springframework.stereotype.controller ؛ استيراد org.springframework.web.bind.annotation.requestmapping ؛ استيراد org.springframework.web {private static gson gson = new gson () ؛ ResponseBodyReQuestMapping (value = "/test" ، method = requestMethod.post) public publicparam checkparam (validparam studentparam param ، @notnull integer limit) {system.out.println (gson.tojson (param)) ؛ system.out.println (limit) ؛ إرجاع بارام ؛ }} تم تحميل رمز العينة في هذا القسم إلى github: https://github.com/liaosilzu2007/ssm-parent.git
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.