Nesse post continuaremos falando da JSR-303 Bean Validation, falare-mos sobre validação Cross-Field,
haverão situações onde será necessário validar um campo, dependendo do valor de outro,
também podemos tirar vantagem da JSR-303 nesse cenário, usaremos os validadores de classe
# Validação baseada em múltiplos campos
Veja o seguinte validator/anotação, usado para verificar a unicidade do campo
userName na classe User
Consegue ver o problema?! Se usarmos a anotação no atributo userName
o validador recebera apenas o valor do campo, e no caso de uma operação
de atualização, podemos ter uma falsa falha na validação,
no caso de informar o mesmo userName para o registro que desejamos
atualizar. Veja:
Se enviarmos esse payload para o endpoint de atualização, o campo userName lançará um erro
de ConstraintViolation, pois, o método userRepository.existsByUserName(value) vai retornar true.
O problema aqui é que não levamos em consideração o id quando ele existe, para isso,
vamos alterar nosso validador
Agora o validador espera a classe User, ao invés de String,
com isso teremos acesso a todos os atributos em User, e conseguimos
fazer nossa validação como bem entendermos.
Como agora estamos validando a classe, e queremos marcar um campo específico como errado, usamos
context.disableDefaultConstraintViolation() para desabilitar o comportamento padrão,
e usamos:
Para que tudo funcione como esperado, também temos que atualizar nossa anotação:
Com isso, sinalizamos que essa anotação só pode ser usada a nível de classe.
Por fim temos nosso modelo