Domanda

Se avere una classe Java con alcuni campi che voglio per convalidare usando Hibernate Validator. Ora voglio i miei utenti siano in grado di configurare in fase di esecuzione che convalide avvenire.

Ad esempio:

public class MyPojo {
    ...

    @NotEmpty
    String void getMyField() {
        ... 
    }

    ...
}

Diciamo che voglio rimuovere il controllo NotEmpty o sostituirla con Email o CreditCardNumber, come posso farlo? E 'anche possibile? Credo che si tratta di cambiare le annotazioni in fase di esecuzione ...

È stato utile?

Soluzione

Non si può fare normalmente.

Ecco quello che ho fatto per ottenere convalide più dinamiche lavorativi tramite Hibernate Validator.

  1. Estendere la classe ClassValidator.
  2. l'override del metodo getInvalidVaues(Object myObj). In primo luogo, chiamare super.getInvalidValues(myObj), quindi aggiungere il gancio per il vostro convalida personalizzato.
  3. un'istanza per il validatore personalizzato e chiamare getInvalidValues per convalidare. Eventuali hibernate annotato convalide daranno il via a questo punto, e le vostre convalide dinamici personalizzati (qualsiasi cosa non supportata da annotazioni) prenderà il via pure.

Esempio:

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

}

Quindi, il codice di convalida personalizzato può contenere la logica del tipo "Fate questo convalida, se l'utente configurato, altrimenti fare quello", ecc Si può o non può essere in grado di sfruttare lo stesso codice che alimenta le convalide Hibernate, ma in entrambi i casi, quello che stai facendo è più coinvolto che il caso d'uso 'normale' per Hibernate validator.

Altri suggerimenti

In realtà è possibile in Hibernate Validator 4.1. Basta leggere la documentazione sulla creazione vincolo programmatico .

Non credo che sarete in grado di rimuovere o modificare l'annotazione, è parte della definizione della classe. È possibile costruire una nuova classe, il che è possibile in fase di esecuzione, ma un po 'coinvolto. Hibernate può supportare l'accesso programmatico alle convalide e consentono di ignorare l'annotazione, non so l'API che bene. Hibernate fa un po 'di costruzione di classe di esecuzione stesso ... che potrebbe essere un buon posto per imparare come farlo se siete interessati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top