Spring suporta dois métodos de validação diferentes: validação Spring e validação de bean JSR-303. Ambos podem ser usados definindo um validador Spring que delega a outros delegadores, incluindo o validador de bean. Por enquanto, tudo bem.
Mas ao anotar métodos para realmente solicitar validação, é outra história. Eu posso anotar assim
@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Valid @RequestBody TestObject obj, BindingResult result) {
ou assim
@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Validated @RequestBody TestObject obj, BindingResult result) {
Aqui, @Valid é javax.validation.Valid e @Validated é org.springframework.validation.annotation.Validated . Os documentos deste último dizem
Variante do Valid JSR-303, suportando a especificação de grupos de validação. Projetado para uso conveniente com o suporte JSR-303 do Spring, mas não específico para JSR-303.
o que não ajuda muito porque não diz exatamente como é diferente. Se for assim. Ambos parecem estar funcionando muito bem para mim.
fonte
Respostas:
Como você citou na documentação,
@Validated
foi adicionado para oferecer suporte a "grupos de validação", ou seja, grupo de campos no bean validado. Isso pode ser usado em formulários de várias etapas, onde você pode validar nome, e-mail, etc. na primeira etapa e, em seguida, outros campos nas etapas seguintes.O motivo pelo qual isso não foi adicionado à
@Valid
anotação é porque ele é padronizado usando o processo da comunidade java (JSR-303), que leva tempo e os desenvolvedores do Spring queriam permitir que as pessoas usassem essa funcionalidade mais cedo.Acesse este tíquete jira para ver como a anotação surgiu.
fonte
Uma resposta mais direta. Para quem ainda não sabe o que é "grupo de validação" .
Uso para
@Valid
validaçãoControlador:
Objeto de formulário:
@Validated
Fonte de uso para grupo de validação : http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html
Controlador:
Objeto de formulário:
fonte
Nos trechos de código de exemplo da pergunta,
@Valid
e@Validated
não faz diferença. Mas se o@RequestBody
for anotado com umList
objeto, ou for um valor de string anotado por@RequestParam
, a validação não terá efeito.Podemos usar a
@Validated
capacidade de validação em nível de método de para fazê-lo funcionar. Para isso, o ponto-chave é colocar@Validated
na classe. Esta pode ser outra diferença importante entre@Valid
e@Validated
na estrutura da mola.Refrence
fonte
List
objetos? Presumo que isso também não funcionará para outras coleções comoMap
? Talvez você pudesse me dar uma explicação mais detalhada na minha pergunta: stackoverflow.com/questions/60167961/…além do acima, você só pode aplicar
@Valid
em um domínio / campo para validação aninhada, não com um@validated
.fonte