introdução
Ao usar o SpringMVC como camada do controlador para o desenvolvimento da Web, geralmente é necessário executar a verificação de parâmetros em métodos no controlador. Originalmente, o SpringMVC vem com duas anotações @Valid e @validadas anotações que podem ser usadas para verificar os parâmetros, mas só podem ser verificados quando os parâmetros são feijões. Não é aplicável aos de string ou por muito tempo. Às vezes, essas duas anotações falham de repente (os motivos não foram investigados com cuidado). Nesse sentido, você pode usar as anotações AOP e personalizadas da Spring para escrever uma função de verificação de parâmetros por si mesmo.
Exemplo de código
Nota: O código nesta seção é apenas uma demonstração, dando uma idéia viável, não uma solução completa.
Este projeto é um projeto da web simples, que é usado: Spring, Springmvc, Maven, JDK1.8
Estrutura do projeto:
Anotações personalizadas:
ValidParam.java:
pacote com.lzumetal.ssm.paramcheck.annotation; importar java.lang.annotation.
Notnull.java:
pacote com.lzumetal.ssm.paramcheck.annotation; importar java.lang.annotation.*;@Target ({ElementType.field, elementType.parameter})@retention(retEntionPolicy.Runtime)@documentEdpublic @interface NotNull {string msg () default; }NotEmpty.java:
pacote com.lzumetal.ssm.paramcheck.annotation; importar java.lang.annotation.*;@Target ({elementType.field, elementType.parameter})@retention(retionPolicy.runtime)@documentedpublic @interface Notempts {string msg () } Corte de rosto
ParamCheckaspect.java:
pacote com.lzumetal.ssm.paramcheck.aspect; importar com.lzumetal.ssm.paramcheck.annotation.notEmpty; importação com.lzumetal.ssm.paramcheck.annotation.notnull; import com.lzumetal.sm.paramcheck.annotation.notation.NotationPomparamPonidamPonidam; org.apache.commons.lang3.StringUtils; importar org.aspectj.lang.joinpoint; importar org.aspectj.lang.annotation.aspect; importar org.aspectj.lang.annotation.before; importar org.aspectj.lang.eflect.methodsignature; javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; importar javax.servlet.http.httpSertLeSponse; importação; importação.mfield.httPenstion; importação; importação; importação; importação; importação; importação.http.httpSesstleSponse; importação; importação; importação; importação; importação; importação; importação.http.httpSesstleSponse; importação; importação; importação; importação; importação; importação; importação.http.httPertLestSoSe; java.lang.reflect.parameter; importar java.util.arrays;/***Class de faceta de verificação de parâmetros*/@aspecto@componentPublic classe paramCheckaspect {@before ("Execution) (*com.lzumetal.ssm.paramcheck.Controlller.*.*. objeto objeto [] args = jun juntpoint.getargs (); // Get Método Parâmetros MétodoSignature Signature = (MethodSignature) junçãoPoint.getSignature (); Parâmetro [] parâmetros = assinatura.getMethod (). GetParameters (); for (int i = 0; i <parâmetros.length; i ++) {parâmetro parâmetro = parâmetros [i]; // Os próprios tipos básicos de parâmetros de Java (como inteiro, string) são processados se (isPrimite (parameter.getType ())) {notnull notnull = parameter.getannotation (notnull.class); if (notnull! = null && args [i] == null) {throw new RunTimeException (parameter.toString () + notnull.msg ()); } // TODO continue; } /** Nenhum processamento é feito quando a anotação @ValidParam não está marcada, ou quando é httpServletRequest, httpServletResponse ou httpSession não é feito* / if (parameter.gettype () .SassignableFrom (httpsLerestass.cl. Parameter.getType (). ISASSIGNABLEFROM (httpSession.class) ||. } Classe <?> Paramclazz = parameter.getType (); // Obtenha o objeto de parâmetro correspondente ao tipo. A interface no controlador no projeto real não passará dois parâmetros do mesmo tipo personalizado; portanto, use findfirst () diretamente aqui. Objeto arg = arrays.stream (args) .Filter (ar -> paramclazz.isassignablefrom (ar.getclass ())). Findfirst (). Get (); // Obter todas as variáveis de membro do campo do parâmetro [] declararfields = paramclazz.getDeclaredFields (); for (campo de campo: declaradofields) {field.setAccessible (true); // verifique os campos marcados com @NotNull notnull = field.getannotation (notnull.class); if (notnull! = null) {object fieldValue = field.get (arg); if (fieldValue == NULL) {throw new RunTimeException (field.getName () + notnull.msg ()); }} // Verifique os campos marcados com a anotação @NotEmpty, o NotEmpty é usado apenas no tipo de string notepty notempty = field.getannotation (notempty.class); if (NotEmpty! = null) {if (! string.class.isassignablefrom (field.gettype ())) {lança nova runimeTimeException ("anotação noturna usando em uma classe de campo errada"); } String fieldstr = (string) field.get (arg); if (stringutils.isblank (fieldstr)) {throw new RunTimeException (field.getName () + notempty.msg ()); }}}}} /** * Determine se é um tipo básico: incluindo string * @param clazz clazz * @return true: sim; Falso: não */ private boolean isPrimite (classe <?> clazz) {return clazz.isPrimitive () || clazz == string.class; }} Parâmetros Javabean
StudentParam.java:
pacote com.lzumetal.ssm.paramcheck.requestparam; importar com.lzumetal.ssm.paramcheck.annotation.notEmpty; importação com.lzumetal.ssm.paramcheck.annotation.notnull; public class StudentParam {@NotNull Private Integeger; idade inteira privada; @NotEmpty Private String Name; // obtenha, definir métodos omitidos ...} Controlador para verificar a verificação de parâmetros
Testcontroller.java:
pacote com.lzumetal.ssm.paramcheck.controller; import com.google.gson.gson; importação com.lzumetal.ssm.paramcheck.annotation.notnull; import.lzumetal.smm.Paramcheck.annotation.validParam; com.lzumetal.sm.sm.; org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;@Controllerpublic class TestController {private estático gson gson = new gson (); @ResponseBody @RequestMapping (value = "/teste", método = requestMethod.post) public studentparam checkparam (@ValidParam StudentParam param, @NotNull integer limite) {System.out.println (gson.tojson (param)); System.out.println (limite); retornar param; }} O código de amostra nesta seção foi enviado para o Github: https://github.com/liaosilzu2007/ssm-parent.git
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.