Come posso cambiare le annotazioni / Hibernate regole di convalida in fase di esecuzione?
-
09-09-2019 - |
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 ...
Soluzione
Non si può fare normalmente.
Ecco quello che ho fatto per ottenere convalide più dinamiche lavorativi tramite Hibernate Validator.
- Estendere la classe
ClassValidator
. - l'override del metodo
getInvalidVaues(Object myObj)
. In primo luogo, chiamaresuper.getInvalidValues(myObj)
, quindi aggiungere il gancio per il vostro convalida personalizzato. - 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.