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 ...

Foi útil?

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.

  1. Estender a classe ClassValidator.
  2. Substitua o método getInvalidVaues(Object myObj). Primeiro, chamada super.getInvalidValues(myObj), em seguida, adicione o gancho para a sua validação personalizada.
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top