Einführung
Bei Verwendung von SpringMVC als Controller -Ebene für die Webentwicklung ist häufig erforderlich, um die Parameterprüfung auf Methoden in Controller durchzuführen. Ursprünglich ist SpringMVC mit zwei Anmerkungen @Valid und @Validated Annotations geliefert, mit denen die Parameter überprüft werden können. Es kann jedoch nur überprüft werden, wenn die Parameter Bohnen sind. Es gilt nicht für die von String oder Long. Manchmal scheitern diese beiden Anmerkungen plötzlich (die Gründe wurden nicht sorgfältig untersucht). In dieser Hinsicht können Sie die AOP- und benutzerdefinierten Anmerkungen von Spring verwenden, um eine Parameterüberprüfungsfunktion selbst zu schreiben.
Codebeispiel
Hinweis: Der Code in diesem Abschnitt ist nur eine Demonstration, die eine praktikable Idee gibt, keine vollständige Lösung.
Dieses Projekt ist ein einfaches Webprojekt, das verwendet wird: Spring, SpringMVC, Maven, JDK1.8
Projektstruktur:
Benutzerdefinierte Anmerkungen:
Validparam.java:
Paket com.lzumetal.ssm.paramcheck.annotation; importieren java.lang.annotation.
Notnull.java:
Paket com.lzumetal.ssm.paramcheck.annotation; import Java.lang.Annotation. }
Notieren.java:
Paket com.lzumetal.ssm.paramcheck.annotation; import Java.lang.Annotation. }
Gesichtsschneide
ParamCheckaspect.java:
Paket com.lzumetal.ssm.paramcheck.aspep; import com.lzumetal.ssm.paramcheck.annotation org.apache.commons.lang3.stringutils; import org.aspespectj.lang.joinpoint; import org.aspespec.lang.Annotation. javax.servlet.http.httpServletRequest; import javax.servlet.http.httpserdRetResponse; import Javax.servlet.http.httpservletResponse; import.Servlet.http.httpSession; import.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.Reflect.Reflect.flect.flect.flect.flect.flect.flect.flect.flect. java.lang.reflect.parameter; importieren java.util.arrays;/***Parameterüberprüfung Facettenklasse*/@Aspekt@componentpublic class ParamCheckaspect {@before ("Execution (*com.lzumetal.ssm.ParamCheck.Controller. Object [] args = joinpoint.getargs (); // Methodenparameter methodInature signature = (methodeInt) joinpoint.getSignature (); Parameter [] parameter = Signature.getMethod (). GetParameters (); für (int i = 0; i <parameter.length; i ++) {parameter parameter = parameter [i]; // Javas eigene Grundtypen von Parametern (z. B. Ganzzahl, String) werden verarbeitet, wenn (isPrimite (parameter.gettType ())) {Notnull notnull = parameter.getannotation (Notnull.class); if (notnull! } // Todo weiter; } /** Es erfolgt keine Verarbeitung, wenn die @validparam -Annotation nicht markiert ist oder wenn es sich um httpServletRequest handelt, httpServletResponse oder httpSession ist nicht erledigt* / if (parameter.gettType (). parameter.gettType (). isassignableFrom (httpSession.class) ||. } Class <?> Paramclazz = parameter.gettType (); // Erhalten Sie das Parameterobjekt, das dem Typ entspricht. Die Schnittstelle im Controller im tatsächlichen Projekt überträgt nicht zwei Parameter desselben benutzerdefinierten Typs. Verwenden Sie daher hier findFirst (). Object arg = arrays.stream (args) .filter (ar -> paramclazz.issidesignableFrom (ar.getClass ())). Findfirst (). Get (); // Alle Mitgliedsvariablen des Parameterfeldes [] deklaredFields = paramclazz.getDeclaredfields () erhalten; für (Feldfeld: deklariertefields) {field.setAccessible (true); // Überprüfen Sie die Felder, die mit @notnull notnull = field.getAnnotation (notnull.class) markiert werden; if (notnull! = null) {Object fieldValue = field.get (arg); if (fieldValue == null) {throw New RunTimeException (field.getName () + Notnull.msg ()); }} // Überprüfen Sie die Felder, die mit @notEmpty Annotation gekennzeichnet sind. Notize wird nur für den String -Typ notieren notingMpty = field.getAnnotation (notchpty.class) verwendet; if (notchpty! } String fieldStr = (string) field.get (arg); if (stringutils.isblank (fieldStr)) {neue runTimeException (field.getName () + notchpty.msg ()); }}}}} /** * Bestimmen Sie, ob es sich um einen Basistyp handelt: einschließlich String * @param clazz clazz * @return true: Ja; Falsch: Nicht */ privat boolean isPrimite (Klasse <?> Clazz) {return clazz.iprimitive () || clazz == string.class; }} Parameter Javabean
Studentparam.java:
Paket com.lzumetal.ssm.paramcheck.requestparam; import com.lzumetal.ssm.paramcheck.annotation privates Ganzzahlalter; @NotEmpty Private String Name; // Get, setzen Sie Methoden weggelassen ...}
Controller zur Überprüfung der Parameterüberprüfung
Testcontroller.java:
Paket com.lzumetal.ssm.paramcheck.controller; import com.google.gson.gson; import com.lzumetal.ssm.paramcheck.annotation.notnull; org. Testcontroller {private static gson gson = new gson (); @ResponseBody @RequestMapping (value = "/test", method = requestMethod.post) public studentParam checkParam (@validparam studentParam Param, @notnull Integer Limit) {System.out.println (gson.tojson (Param)); System.out.println (Limit); Rückgabeparam; }} Der Beispielcode in diesem Abschnitt wurde auf GitHub hochgeladen: https://github.com/liaosilzu2007/ssm-parent.git
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.