Gostaria de saber qual é a melhor e mais limpa maneira de executar a validação de formulário das entradas do usuário. Eu já vi alguns desenvolvedores implementarem org.springframework.validation.Validator
. Uma pergunta sobre isso: vi que valida uma classe. A classe precisa ser preenchida manualmente com os valores da entrada do usuário e depois passada para o validador?
Estou confuso sobre a maneira mais limpa e melhor de validar a entrada do usuário. Conheço o método tradicional de usar request.getParameter()
e, em seguida, verificar manualmente nulls
, mas não quero fazer toda a validação no meu Controller
. Alguns bons conselhos sobre essa área serão muito apreciados. Não estou usando o Hibernate neste aplicativo.
java
spring-mvc
validation
user-input
devdar
fonte
fonte
Respostas:
Com o Spring MVC, existem três maneiras diferentes de executar a validação: usando anotação, manualmente ou uma mistura de ambas. Não existe uma "maneira mais limpa e melhor" única de validar, mas provavelmente existe uma que se adapte melhor ao seu projeto / problema / contexto.
Vamos ter um usuário:
Método 1: Se você tiver o Spring 3.x + e uma validação simples, use as
javax.validation.constraints
anotações (também conhecidas como anotações JSR-303).Você precisará de um provedor JSR-303 em suas bibliotecas, como o Hibernate Validator, que é a implementação de referência (esta biblioteca não tem nada a ver com bancos de dados e mapeamento relacional, apenas validação :-).
Então, no seu controlador, você teria algo como:
Observe o @Valid: se o usuário tiver um nome nulo, result.hasErrors () será verdadeiro.
Método 2: se você possui validação complexa (como lógica de validação de grandes empresas, validação condicional em vários campos etc.) ou, por algum motivo, não pode usar o método 1, use a validação manual. É uma boa prática separar o código do controlador da lógica de validação. Não crie suas classes de validação do zero,
org.springframework.validation.Validator
pois o Spring fornece uma interface prática (desde o Spring 2).Então, digamos que você tenha
e você deseja fazer uma validação "complexa", como: se a idade do usuário for menor de 18 anos, o responsávelUsuário não deve ser nulo e a idade do responsável responsável deve ser superior a 21.
Você fará algo assim
Então, no seu controlador, você teria:
Se houver erros de validação, result.hasErrors () será verdadeiro.
Nota: Você também pode definir o validador no método @InitBinder do controlador, com "binder.setValidator (...)" (nesse caso, o uso misto dos métodos 1 e 2 não seria possível, porque você substitui o padrão validador). Ou você pode instancia-lo no construtor padrão do controlador. Ou tenha um @ Component / @ Service UserValidator que você injeta (@Autowired) em seu controlador: muito útil, porque a maioria dos validadores são singletons + a simulação de teste de unidade se torna mais fácil + seu validador pode chamar outros componentes do Spring.
Método 3: Por que não usar uma combinação dos dois métodos? Valide as coisas simples, como o atributo "nome", com anotações (é rápido, conciso e mais legível). Mantenha as validações pesadas dos validadores (quando levaria horas para codificar anotações de validação complexas personalizadas ou apenas quando não é possível usar anotações). Eu fiz isso em um projeto anterior, funcionou como um encanto, rápido e fácil.
Aviso: você não deve confundir manipulação de validação com manipulação de exceção . Leia este post para saber quando usá-los.
Referências :
fonte
Existem duas maneiras de validar a entrada do usuário: anotações e herdar a classe Validator do Spring. Para casos simples, as anotações são boas. Se você precisar de validações complexas (como validação entre campos, por exemplo, campo "verificar endereço de email"), ou se o seu modelo for validado em vários locais do seu aplicativo com regras diferentes, ou se você não tiver a capacidade de modificar seu objeto de modelo colocando anotações nele, o Validator baseado em herança do Spring é o caminho a percorrer. Vou mostrar exemplos de ambos.
A parte da validação real é a mesma, independentemente do tipo de validação que você está usando:
Se você estiver usando anotações, sua
Foo
classe poderá se parecer com:As anotações acima são
javax.validation.constraints
anotações. Você também pode usar o Hibernateorg.hibernate.validator.constraints
, mas não parece que você está usando o Hibernate.Como alternativa, se você implementar o Validador do Spring, criará uma classe da seguinte maneira:
Se estiver usando o validador acima, você também precisará vincular o validador ao controlador Spring (não necessário se estiver usando anotações):
Veja também os documentos do Spring .
Espero que ajude.
fonte
Foo
parâmetro no método manipulador. Você pode esclarecer?Gostaria de estender uma boa resposta de Jerome Dalbert. Achei muito fácil escrever seus próprios validadores de anotação no modo JSR-303. Você não está limitado a ter a validação de "um campo". Você pode criar sua própria anotação no nível de tipo e ter validação complexa (veja exemplos abaixo). Prefiro assim, porque não preciso misturar diferentes tipos de validação (Spring e JSR-303) como Jerome. Além disso, esses validadores são "cientes da mola", para que você possa usar @ Inject / @ Autowire fora da caixa.
Exemplo de validação de objeto customizado:
Exemplo de igualdade de campos genéricos:
fonte
ElementType.METHOD
no@Target
.Se você tiver a mesma lógica de manipulação de erros para diferentes manipuladores de métodos, você acabará com muitos manipuladores com o seguinte padrão de código:
Suponha que você esteja criando serviços RESTful e deseje retornar
400 Bad Request
junto com mensagens de erro para cada caso de erro de validação. Em seguida, a parte de manipulação de erros seria a mesma para todos os terminais REST que requerem validação. Repetir essa mesma lógica em cada manipulador não é tão DRY ish!Uma maneira de resolver esse problema é eliminar o imediato
BindingResult
após cada bean A validar . Agora, seu manipulador seria assim:Dessa forma, se o bean vinculado não for válido, a
MethodArgumentNotValidException
será lançada pelo Spring. Você pode definir umControllerAdvice
que lide com essa exceção com a mesma lógica de tratamento de erros:Você ainda pode examinar o método subjacente
BindingResult
usando .getBindingResult
MethodArgumentNotValidException
fonte
Encontre um exemplo completo da validação do Spring Mvc
fonte
Coloque esse bean em sua classe de configuração.
e então você pode usar
para validar um bean manualmente. Então você obterá todos os resultados em BindingResult e poderá recuperar a partir daí.
fonte