Validated, Valid, Validator: você conhece a diferença entre eles
Tags relacionadas:1. Alibaba Cloud oferece HSM validado pelo FIPS para segurança de chaves criptográficas
2. Validade de nome de domínio
Validated, Valid, Validator: você conhece a diferença entre eles
1. Conclusão primeiro
Valid VS Validated Semelhanças
•Ambos os métodos e parâmetros podem ser validados
•@Valid e @Validated Ambas as anotações fazem com que a bean validation padrão seja aplicada.
Se a validação falhar, uma BindException será lançada e uma resposta 400 (BAD_REQUEST) será retornada; ou os erros de validação podem ser tratados localmente no controlador por meio dos parâmetros Errors ou BindingResult. Além disso, se houver uma anotação @RequestBody antes do parâmetro, o erro de validação lançará uma exceção MethodArgumentNotValidException.
JSR 380
A JSR 380 é a especificação da API Java para bean validation e faz parte do Jakarta EE e do JavaSE. Ela garante que as propriedades do bean atendam a determinadas condições, usando anotações como @NotNull, @Min e @Max.
Esta versão requer Java 8 ou posterior e aproveita os novos recursos adicionados no Java 8, como anotações de tipo e suporte a novos tipos como Optional e LocalDate.
Para informações completas sobre a especificação, continue lendo a JSR 380.
javax.validation.Valid _
oÉ a anotação padrão da especificação JSR-303, sendo uma anotação de marcação.
oA anotação suporta ElementType#METHOD, ElementType#FIELD, ElementType#CONSTRUCTOR,
oElementType#PARAMETER, ElementType#TYPE_USE
•org.springframework.validation.annotation.Validated _
oÉ uma anotação personalizada criada pelo Spring que aprimora a funcionalidade de grupos.
oA anotação suporta ElementType#TYPE, ElementType#METHOD, ElementType#PARAMETER
Diferença entre @Valid e @Validated
O Bean Validation 2.0 (JSR 380) define um modelo de metadados e uma API para validação de entidades e métodos, e o Hibernate Validator é a melhor implementação atualmente
A interface Validator possui três métodos que podem ser usados para validar a entidade inteira ou apenas uma única propriedade da entidade
•Validator#validate() valida todas as restrições em todos os beans
•Validator#validateProperty() valida uma única propriedade
•Validator#validateValue() verifica se uma única propriedade de uma determinada classe pode ser validada com sucesso
Seja na verificação de parâmetros do requestBody ou na verificação no nível de método, o Hibernate Validator é chamado para realizar a verificação, e o Spring Validation apenas faz uma camada de encapsulamento.
A validação de entrada do usuário é um recurso comum na maioria das nossas aplicações. No ecossistema Java, usamos exclusivamente a API Java Standard Bean Validation para oferecer esse suporte. Além disso, a partir da versão 4.0, ela também está bem integrada ao Spring.
Nas próximas seções, vamos entendê-las em detalhes.
Anotações @Valid e @Validated
No Spring, usamos a anotação @Valid da JSR-303 para validação no nível de método. Também a usamos para marcar propriedades de membro para validação. No entanto, essa anotação não suporta validação por grupos.
Os grupos ajudam a limitar as restrições aplicadas durante a validação. Um caso de uso especial são os assistentes de UI. Neles, na primeira etapa, podemos ter algum subgrupo de campos. Nas etapas seguintes, pode haver outro grupo pertencente ao mesmo bean. Portanto, precisamos aplicar restrições nesses campos limitados em cada etapa, mas o @Valid não oferece esse suporte.
Nesse caso, para o nível de grupo, precisamos usar o @Validated do Spring, que é uma variante do @Valid da JSR-303. Ele é usado no nível de método. Para marcar propriedades de membro, continuamos usando a anotação @Valid.
Agora, vamos direto ao ponto e ver o uso dessas anotações com um exemplo.

Vamos considerar um registro de usuário simples desenvolvido com Spring Boot. Primeiro, teremos apenas as propriedades nome e senha:
Após confirmar que o teste foi executado com sucesso, agora expandimos a funcionalidade. O próximo passo lógico é convertê-lo em um registro de usuário complexo. Na primeira etapa, o nome e a senha permanecem os mesmos. Na segunda etapa, obteremos informações adicionais como idade e telefone. Então atualizaremos nosso objeto de domínio com esses campos adicionais:
No entanto, desta vez notaremos que o teste anterior falhou. Isso ocorre porque não passamos os campos de idade e telefone. Para oferecer suporte a esse comportamento, precisamos de validação por grupos e da anotação @Validated.
Para fazer isso, precisamos agrupar os campos, criando dois grupos diferentes. Primeiro, precisamos criar duas interfaces marcadoras. Uma para cada grupo ou cada etapa individualmente. Podemos consultar nosso artigo sobre validação por grupos para ver como ela é implementada. Aqui, vamos nos concentrar nas diferenças entre as anotações.
Teremos a interface BasicInfo para a primeira etapa e AdvanceInfo para a segunda etapa. Além disso, atualizaremos a classe UserAccount para usar essas interfaces marcadoras da seguinte forma:
Em seguida, vamos ver como o @Valid aciona a validação de propriedades aninhadas.
A anotação @Valid é usada para validar propriedades aninhadas. Ela aciona a validação de objetos aninhados. Por exemplo, no nosso cenário atual, vamos criar um objeto UserAddress:
5. Combinar @Valid e @Validated para realizar verificação de conjunto
Se o corpo da requisição passar diretamente um array JSON para o back-end, e você quiser realizar a verificação de parâmetros em cada item do array. Nesse momento, se usarmos diretamente a lista ou conjunto de java.util.Collection para receber dados, a verificação de parâmetros não terá efeito! Podemos usar uma coleção de lista personalizada para receber parâmetros:
•Envolver o tipo List e declarar a anotação @Valid
package com.devicemag.core.BO;
import javax.validation.Valid ; _
import java.util .*;
Validated, Valid, Validator.Conclusão
Validated, Valid, Validator.Em conclusão, para qualquer validação básica, usaremos a anotação @Valid da JSR na chamada de método. Por outro lado, para qualquer validação por grupos, incluindo sequências de grupos, precisamos usar a anotação @Validated do Spring nas nossas chamadas de método. A anotação @Valid também é necessária para acionar a validação de propriedades aninhadas.
O Validated ainda é AOP. Na verificação de método, o método de interceptação dinâmica AOP é usado, e o Validator JSR303 é utilizado para concluir a verificação. Na verificação de atributos do Bean, ela se baseia no ciclo de vida do Bean, e a verificação é concluída antes e depois da sua inicialização.
2. Validade de nome de domínio
Validated, Valid, Validator: você conhece a diferença entre eles
1. Conclusão primeiro
Valid VS Validated Semelhanças
•Ambos os métodos e parâmetros podem ser validados
•@Valid e @Validated Ambas as anotações fazem com que a bean validation padrão seja aplicada.
Se a validação falhar, uma BindException será lançada e uma resposta 400 (BAD_REQUEST) será retornada; ou os erros de validação podem ser tratados localmente no controlador por meio dos parâmetros Errors ou BindingResult. Além disso, se houver uma anotação @RequestBody antes do parâmetro, o erro de validação lançará uma exceção MethodArgumentNotValidException.
JSR 380
A JSR 380 é a especificação da API Java para bean validation e faz parte do Jakarta EE e do JavaSE. Ela garante que as propriedades do bean atendam a determinadas condições, usando anotações como @NotNull, @Min e @Max.
Esta versão requer Java 8 ou posterior e aproveita os novos recursos adicionados no Java 8, como anotações de tipo e suporte a novos tipos como Optional e LocalDate.
Para informações completas sobre a especificação, continue lendo a JSR 380.
Qual é a diferença entre Valid VS Validated?
javax.validation.Valid _
oÉ a anotação padrão da especificação JSR-303, sendo uma anotação de marcação.
oA anotação suporta ElementType#METHOD, ElementType#FIELD, ElementType#CONSTRUCTOR,
oElementType#PARAMETER, ElementType#TYPE_USE
•org.springframework.validation.annotation.Validated _
oÉ uma anotação personalizada criada pelo Spring que aprimora a funcionalidade de grupos.
oA anotação suporta ElementType#TYPE, ElementType#METHOD, ElementType#PARAMETER
Diferença entre @Valid e @Validated
Validated, Valid, Validator.Validator
O Bean Validation 2.0 (JSR 380) define um modelo de metadados e uma API para validação de entidades e métodos, e o Hibernate Validator é a melhor implementação atualmente
A interface Validator possui três métodos que podem ser usados para validar a entidade inteira ou apenas uma única propriedade da entidade
•Validator#validate() valida todas as restrições em todos os beans
•Validator#validateProperty() valida uma única propriedade
•Validator#validateValue() verifica se uma única propriedade de uma determinada classe pode ser validada com sucesso
Seja na verificação de parâmetros do requestBody ou na verificação no nível de método, o Hibernate Validator é chamado para realizar a verificação, e o Spring Validation apenas faz uma camada de encapsulamento.
A validação de entrada do usuário é um recurso comum na maioria das nossas aplicações. No ecossistema Java, usamos exclusivamente a API Java Standard Bean Validation para oferecer esse suporte. Além disso, a partir da versão 4.0, ela também está bem integrada ao Spring.
Nas próximas seções, vamos entendê-las em detalhes.
Anotações @Valid e @Validated
No Spring, usamos a anotação @Valid da JSR-303 para validação no nível de método. Também a usamos para marcar propriedades de membro para validação. No entanto, essa anotação não suporta validação por grupos.
Os grupos ajudam a limitar as restrições aplicadas durante a validação. Um caso de uso especial são os assistentes de UI. Neles, na primeira etapa, podemos ter algum subgrupo de campos. Nas etapas seguintes, pode haver outro grupo pertencente ao mesmo bean. Portanto, precisamos aplicar restrições nesses campos limitados em cada etapa, mas o @Valid não oferece esse suporte.
Nesse caso, para o nível de grupo, precisamos usar o @Validated do Spring, que é uma variante do @Valid da JSR-303. Ele é usado no nível de método. Para marcar propriedades de membro, continuamos usando a anotação @Valid.
Agora, vamos direto ao ponto e ver o uso dessas anotações com um exemplo.

3. Exemplos
Vamos considerar um registro de usuário simples desenvolvido com Spring Boot. Primeiro, teremos apenas as propriedades nome e senha:
Após confirmar que o teste foi executado com sucesso, agora expandimos a funcionalidade. O próximo passo lógico é convertê-lo em um registro de usuário complexo. Na primeira etapa, o nome e a senha permanecem os mesmos. Na segunda etapa, obteremos informações adicionais como idade e telefone. Então atualizaremos nosso objeto de domínio com esses campos adicionais:
No entanto, desta vez notaremos que o teste anterior falhou. Isso ocorre porque não passamos os campos de idade e telefone. Para oferecer suporte a esse comportamento, precisamos de validação por grupos e da anotação @Validated.
Para fazer isso, precisamos agrupar os campos, criando dois grupos diferentes. Primeiro, precisamos criar duas interfaces marcadoras. Uma para cada grupo ou cada etapa individualmente. Podemos consultar nosso artigo sobre validação por grupos para ver como ela é implementada. Aqui, vamos nos concentrar nas diferenças entre as anotações.
Teremos a interface BasicInfo para a primeira etapa e AdvanceInfo para a segunda etapa. Além disso, atualizaremos a classe UserAccount para usar essas interfaces marcadoras da seguinte forma:
Em seguida, vamos ver como o @Valid aciona a validação de propriedades aninhadas.
Validated, Valid, Validator.Usar @Valid para validação aninhada
A anotação @Valid é usada para validar propriedades aninhadas. Ela aciona a validação de objetos aninhados. Por exemplo, no nosso cenário atual, vamos criar um objeto UserAddress:
5. Combinar @Valid e @Validated para realizar verificação de conjunto
Se o corpo da requisição passar diretamente um array JSON para o back-end, e você quiser realizar a verificação de parâmetros em cada item do array. Nesse momento, se usarmos diretamente a lista ou conjunto de java.util.Collection para receber dados, a verificação de parâmetros não terá efeito! Podemos usar uma coleção de lista personalizada para receber parâmetros:
•Envolver o tipo List e declarar a anotação @Valid
package com.devicemag.core.BO;
import javax.validation.Valid ; _
import java.util .*;
Validated, Valid, Validator.Conclusão
Validated, Valid, Validator.Em conclusão, para qualquer validação básica, usaremos a anotação @Valid da JSR na chamada de método. Por outro lado, para qualquer validação por grupos, incluindo sequências de grupos, precisamos usar a anotação @Validated do Spring nas nossas chamadas de método. A anotação @Valid também é necessária para acionar a validação de propriedades aninhadas.
O Validated ainda é AOP. Na verificação de método, o método de interceptação dinâmica AOP é usado, e o Validator JSR303 é utilizado para concluir a verificação. Na verificação de atributos do Bean, ela se baseia no ciclo de vida do Bean, e a verificação é concluída antes e depois da sua inicialização.
