introducción
Cuando se usa SpringMVC como la capa del controlador para el desarrollo web, a menudo es necesario realizar la verificación de parámetros en los métodos en el controlador. Originalmente, SpringMVC viene con dos anotaciones @Valid y @Validated Anotaciones que se pueden usar para verificar los parámetros, pero solo se puede verificar cuando los parámetros son frijoles. No es aplicable a los de String o Long. A veces, estas dos anotaciones fallan repentinamente (las razones no han sido investigadas con cuidado). En este sentido, puede usar las anotaciones AOP y personalizadas de Spring para escribir una función de verificación de parámetros usted mismo.
Ejemplo de código
Nota: El código en esta sección es solo una demostración, que da una idea factible, no una solución completa.
Este proyecto es un proyecto web simple, que se utiliza: Spring, SpringMVC, Maven, JDK1.8
Estructura del proyecto:
Anotaciones personalizadas:
ValidParam.java:
paquete com.lzumetal.ssm.paramcheck.annotation; import java.lang.annotation.*;/***anotado en el parámetro frijol, lo que indica que el parámetro debe verificarse*/@target ({elementType.parameter})@retención(CretpolicyNonnull.java:
paquete com.lzumetal.ssm.paramcheck.annotation; import java.lang.annotation.*;@target ({elementtype.field, elementtype.parameter})@retención(etententPolicy.runtime)@documentpublic @interface nonnull {string msg () Los archivos no pueden ser vacíos "; }Notempty.java:
paquete com.lzumetal.ssm.paramcheck.annotation; import java.lang.annotation.*;@target ({elementtype.field, elementtype.parameter})@retención(etententPolicy.runtime)@documentpublic @interface no -nopty {string msg () Los archivos no pueden ser vacíos "; } Cortador de la cara
Paramcheckaspect.java:
paquete com.lzumetal.ssm.paramcheck.spect; import com.lzumetal.ssm.paramcheck.annotation.notempty; import org.apache.commons.lang3.stringutils; import org.spectj.lang.joinpoint; import org.aspectj.lang.annotation.aspect; import org.aspectj.lang.annotation.before; import org.aspectj.lang.reflect.methodsignature; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; import javax.servlet.http.httpservletResponse; import javax.servlet.http.httpsession; import java.lang.reflect.field; import java.lang.reflect.parameter; import java.util.arrays;/***Comprobación de parámetro Class*/@aspecto@ComponentPublic de la clase ParamCheckAspect {@BeFore ("Ejecution (*com.lzumetal.ssm.paramcheck.controller.*.*(..)) public void paramcheck (unión de unión). Objeto [] args = uniónPoint.getArgs (); // GET METODO Parámetros MethodeSignature Signature = (Methodsignature) unePoint.getSignature (); Parámetro [] parámetros = firma.getMethod (). GetParameters (); for (int i = 0; i <parámetros.length; i ++) {parámetro parámetro = parámetros [i]; // Los propios tipos básicos de parámetros de Java (como Integer, String) se procesan si (isPrimite (parameter.gettype ())) {noNNULL noNNULL = parameter.getAnnotation (notNull.class); if (noTNull! = null && args [i] == null) {throw new runtimeException (parameter.toString () + noTNull.msg ()); } // para continuar; } /** No se realiza ningún procesamiento cuando la anotación @ValidParam no está marcada, o cuando es httpservletRequest, httpServletResponse, o httpsession no se realiza* / if (parameter.gettype (). ISASSIGNABLABLA (httPservletRequest.class) || parameter.gettype (). ISAssignFrom (httPservletRequest). || parámetro.getAnnotation (ValidParam.Class) == NULL) {Continuar; } Class <?> Paramclazz = parameter.gettype (); // Obtenga el objeto de parámetro correspondiente al tipo. La interfaz en el controlador en el proyecto real no pasará dos parámetros del mismo tipo personalizado, así que use findFirst () directamente aquí. Objeto arg = arrays.stream (args) .filter (ar -> paramclazz.isassignableFrom (ar.getClass ())). FindFirst (). Get (); // Obtenga todas las variables miembros del campo de parámetros [] declaradofields = paramclazz.getDeclaredfields (); para (campo campo: declaradofields) {field.setAccessible (true); // Verifique los campos marcados con @notnull noTNull = field.getAnnotation (noTNull.class); if (noTNull! = null) {objeto fieldValue = field.get (arg); if (FieldValue == NULL) {Throw New RuntimeException (Field.getName () + NotNull.msg ()); }} // Verifique los campos marcados con la anotación @notempty, NotEmty solo se usa en el tipo de cadena NotEtimty NotEtimty = Field.getAnnotation (noTempty.class); if (noTempty! = null) {if (! string.class.isassignableFrom (field.gettype ())) {throw new runtimeException ("anotación notable usando en una clase de campo incorrecta"); } String FieldStr = (String) Field.get (arg); if (StringUtils.isblank (FieldStr)) {Throw New RuntimeException (field.getName () + noTempty.msg ()); }}}}} /** * Determine si es un tipo básico: incluyendo cadena * @param clazz Clazz * @return true: sí; falso: no */ private boolean isprimite (class <?> clazz) {return clazz.isPrimitive () || clazz == String.class; }} Parámetros javabean
StudentParam.java:
paquete com.lzumetal.ssm.paramcheck.requestparam; import com.lzumetal.ssm.paramcheck.annotation.notempty; import com.lzumetal.ssm.paramcheck.annotation.notnull; estudiante de clase pública (@notnull private private introger id; edad de entero privado; @Notempty Nombre de cadena privada; // obtener, establecer métodos omitidos ...}
Controlador para verificar la verificación de parámetros
TestController.java:
paquete 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 org. GSON estático GSON = new Gson (); @ResponseBody @RequestMapping (valor = "/test", método = requestmethod.post) public studentparam checkParam (@ValidParam StudentParam Param, @notnull Integer Limit) {System.out.println (gson.tojson (param)); System.out.println (límite); return Param; }} El código de muestra en esta sección se ha subido a GitHub: https://github.com/liaosilzu2007/ssmparent.git
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.