Como posso alterar anotações / regras de validação do Hibernate em tempo de execução?
-
09-09-2019 - |
Pergunta
Se tiver uma classe Java com alguns campos que eu quero para validar usando o Hibernate Validator. Agora eu quero que meus usuários para ser capaz de configurar em tempo de execução que validações ter lugar.
Por exemplo:
public class MyPojo {
...
@NotEmpty
String void getMyField() {
...
}
...
}
Vamos dizer que eu quero para remover a seleção NotEmpty
ou substituí-la por Email
ou CreditCardNumber
, como posso fazer isso? Será que é mesmo possível? Eu acho que se resume a mudança anotações em tempo de execução ...
Solução
Você não pode fazê-lo normalmente.
Aqui está o que eu fiz para obter validações mais dinâmicos que trabalham via Hibernate Validator.
- Estender a classe
ClassValidator
. - Substitua o método
getInvalidVaues(Object myObj)
. Primeiro, chamadasuper.getInvalidValues(myObj)
, em seguida, adicione o gancho para a sua validação personalizada. - instancia seu validador personalizado e chamada
getInvalidValues
para validar. Quaisquer hibernação anotada validações vai começar neste momento, e suas validações dinâmicos personalizados (qualquer coisa não é suportado por anotações) vai começar também.
Exemplo:
public class MyObjectValidator extends ClassValidator<MyObject>
{
public MyObjectValidator()
{
super(MyObject.class);
}
public InvalidValue[] getInvalidValues(MyObject myObj)
{
List<InvalidValue> invalids = new ArrayList<InvalidValue>();
invalids.addAll(Arrays.asList(super.getInvalidValues(myObj)));
// add custom validations here
invalids.addAll(validateDynamicStuff(myObj));
InvalidValue[] results = new InvalidValue[invalids.size()];
return invalids.toArray(results);
}
private List<InvalidValue> validateDynamicStuff(MyObject myObj)
{
// ... whatever validations you want ...
}
}
Assim, o código de validação personalizado pode conter lógica como "Faça isso de validação, se o usuário configurado, caso contrário, fazer que um", etc. Você pode ou não ser capaz de aproveitar o mesmo código que alimenta o validações de hibernação, mas de qualquer forma, o que está fazendo é mais envolvido que o caso de uso 'normal' para o validador de hibernação.
Outras dicas
Na verdade, é possível em hibernação validador 4.1. Basta ler a documentação sobre criação restrição programático .
Eu não acho que você vai ser capaz de remover ou alterar a anotação, é parte da definição de classe. Você pode construir uma nova classe, o que é possível em tempo de execução, mas um pouco envolvido. Hibernate pode apoiar o acesso programático para as validações e permitem substituir a anotação, eu não sei a API que bem. Hibernate faz um pouco de classe de tempo de execução a construção em si ... que poderia ser um bom lugar para aprender como fazê-lo se você estiver interessado.