introduction
Lorsque vous utilisez SpringMVC comme couche de contrôleur pour le développement Web, il est souvent nécessaire d'effectuer la vérification des paramètres des méthodes dans le contrôleur. À l'origine, SpringMVC est livré avec deux annotations annotations @Valid et @Validated qui peuvent être utilisées pour vérifier les paramètres, mais il ne peut être vérifié que lorsque les paramètres sont des haricots. Il n'est pas applicable à ceux de la chaîne ou du long. Parfois, ces deux annotations échouent soudainement (les raisons n'ont pas été soigneusement étudiées). À cet égard, vous pouvez utiliser les annotations AOP et personnalisées de Spring pour écrire une fonction de vérification des paramètres par vous-même.
Exemple de code
Remarque: Le code de cette section n'est qu'une démonstration, donnant une idée réalisable, pas une solution complète.
Ce projet est un simple projet Web, qui est utilisé: Spring, Springmvc, Maven, JDK1.8
Structure du projet:
Annotations personnalisées:
Validparam.java:
Package com.lzumetal.ssm.paramcheck.annotation; Importer java.lang.annotation. *; / ** * annoté sur le bean du paramètre, indiquant que le paramètre doit être vérifié * / @ Target ({elementType.Parameter}) @ retention(retentionpolicy.runtime)@DocumedPublic @interface Validparam {}Notnull.java:
Package com.lzumetal.ssm.paramcheck.annotation; Importer java.lang.annotation. *; @ Target ({elementType.field, elementType.Parameter}) @ rétention(retentionPolicy.runtime)@docomedPublic @interface notnull {String msg () Les fichiers par défaut ne peuvent pas être vides "; }NotEmpty.java:
Package com.lzumetal.ssm.paramcheck.annotation; Importer java.lang.annotation. *; @ Target ({elementType.field, elementType.Parameter}) @ rétention(retentionPolicy.runtime)@DocumedPublic @Interface Notempty {String msg () Les fichiers par défaut ne peuvent pas être vides "; } Secouer le visage
Paramcheckaspect.java:
package com.lzumetal.ssm.paramcheck.aspect; import com.lzumetal.ssm.paramcheck.annotation.notempty; import com.lzumetal.ssm.paramcheck.annotation.notnull; import com.lzumetal.ssm.paramcheck.annotation.validparam; importation; org.apache.commons.lang3.stringutils; import org.aspectj.lang.joinpoint; import org.aspectj.lang.annotation.aspect; import org.aspectj.lang.annotation.before; import org.aspectj.lang.reflect.methodsignature; importation org.springframeworkwork.SteryType. javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import javax.servlet.http.httpSession; import java.lang.reflect.field; java.lang.reflect.Parameter; Importer java.util.arrays; / ** * Vérification des paramètres Classe de facettes * / @ aspect @ composantpublic class paramcheckaspect {@before ("Execution (* com.lzumetal.ssm.paramcheck.Controller. Objet [] args = joinpoint.getArgs (); // Obtenir des paramètres de méthode Méthodignat Signature = (Methodsignature) joinpoint.getSignature (); Paramètre [] Paramètres = signature.getMethod (). GetParameters (); pour (int i = 0; i <paramètres.length; i ++) {Paramètre Paramètre = paramètres [i]; // Les propres types de paramètres de base de Java (tels que Integer, String) sont traités if (isPrimite (Parameter.getType ())) {notnull notnull = paramètre.getannotation (notnull.class); if (notnull! = null && args [i] == null) {throw new RuntimeException (paramètre.toString () + notnull.msg ()); } // todo continue; } / * * Aucun traitement n'est effectué lorsque l'annotation @validParam n'est pas marquée, ou lorsqu'il est httpservletRequest, httpservletResponse, ou httpSession n'est pas fait * / if (paramètre.getType (). IsAssignableFrom (httpSservletRequest.class) || paramètre.getType (). IsAssignableFrom (httpSession.class) || Paramètre.getAntannotation (validParam.class) == null) {Continuer; } Class <?> Paramclazz = paramètre.getType (); // Obtenez l'objet de paramètre correspondant au type. L'interface du contrôleur du projet réel ne passera pas deux paramètres du même type de personnalité, alors utilisez FindFirst () directement ici. Objet arg = arrays.stream (args) .filter (ar -> paramclazz.isassignableFrom (ar.getClass ())). FindFirst (). Get (); // Obtenez toutes les variables membre du champ de paramètre [] DÉCHARGÉES = PARAMClazz.getDeclaredFields (); pour (champ de champ: DarcladFields) {field.setAccessible (true); // Vérifiez les champs marqués avec @notnull notnull = field.getAnnotation (notnull.class); if (notnull! = null) {objet FieldValue = field.get (arg); if (fieldValue == null) {throw new RuntimeException (field.getName () + notnull.msg ()); }} // Vérifiez les champs marqués avec @Notempty Annotation, NotEmpty est uniquement utilisé sur le type de chaîne Notempty Notempty = field.getAnnotation (NotEmpty.Class); if (notEmpty! = null) {if (! string.class.isAssignableFrom (field.getType ())) {lancez new RuntimeException ("Annotation Notempty en utilisant dans une mauvaise classe de champ"); } String Fieldstr = (String) field.get (arg); if (stringUtils.isblank (FieldStr)) {Throw new RuntimeException (field.getName () + NOTHEMPTY.MSG ()); }}}}} / ** * Déterminez s'il s'agit d'un type de base: y compris la chaîne * @param Clazz Clazz * @return true: Oui; FAUX: pas * / private booléen isprimite (classe <?> Clazz) {return Clazz.isprimitive () || clizz == String.class; }} Paramètres Javabean
StudentParam.java:
Package com.lzumetal.ssm.paramcheck.requestParam; import com.lzumetal.ssm.paramcheck.annotation.notempty; import com.lzumetal.ssm.paramcheck.annotation.notnull; public class studentParam {@NotNull Private Integer ID; Âge entier privé; @Notempty Private String Name; // Obtenez, définissez des méthodes omises ...} Contrôleur pour vérifier la vérification des paramètres
TestController.java:
Package com.lzumetal.ssm.paramcheck.controller; import com.google.gson.gson; import com.lzumetal.ssm.paramcheck.annotation.notnull; import com.lzumetal.ssm.Paramcheck.annotation.validParam; Import com.lzumetal.sssm.paramcheck.requestparam.StudAm. org.springframework.sterreotype.controller; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestMethod statique gson gson = new gson (); @ResponseBody @RequestMapping (value = "/ test", méthode = requestMethod.Post) public StudentParam CheckParam (@ValidParam StudentParam Param, @notnull Integer Limit) {System.out.println (gson.tojson (param)); System.out.println (limite); retour param; }} L'exemple de code de cette section a été téléchargé sur github: https://github.com/liaosilzu2007/ssm-parent.git
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.