2012-01-24 10 views
5

Situazione: Vorrei eseguire la convalida di ibernazione in base alle proprietà dell'utente (per consentire diverse regole di convalida per input basate su dati dell'account di un utente) - Penso che sia possibile utilizzare un file .properties per specificare una particolare espressione regolare, ma non riesco a capire cosa c'è che non va:Come specificare un'annotazione Hibernate "@Pattern" utilizzando un'espressione regolare da un file .properties o database

Il mio metodo attuale di specificare una regex di convalida fa sì che regex da una costante in un particolare file di interfaccia (per mantenere tutto insieme) e lo inserisce come costante in un'annotazione @Pattern() per ogni variabile - ad es. per la variabile workPhone:

@Column(name = "WORK_PHONE") 
@NotEmpty(message = "{ContactInfo.workPhone.notEmpty}") 
@Pattern(regexp = PHONE_NUMBER_PATTERN_SL, message = "{ContactInfo.workPhone.regexp.msg}") 
@Size(max = 10, message = "{ContactInfo.workPhone.size}") 
protected String    workPhone; 

... dove l'espressione regolare viene memorizzato nella static final StringPHONE_NUMBER_PATTERN_SL e tutti i {ContactInfo.workPhone...} chiamate provengono da un file .properties:

ContactInfo.workPhone.notEmpty=Please enter your phone number. 
ContactInfo.workPhone.regexp.msg=Invalid characters entered in phone. Use this format XXX-XXX-XXXX. 
ContactInfo.workPhone.size=Phone can not be longer than 10 digits. 

Purtroppo, questa disposizione rende la convalida pattern application-wide (compilato), poiché non riesco a capire come modificarlo per un utente diverso in un'azienda, posizione, posizione occupazionale, ecc. Per rendere possibile la differenziazione in base a queste informazioni, mi piacerebbe per memorizzare anche la regex nel file delle proprietà, e cerco di includerla in questo modo:

ContactInfo.workPhone.regexp=\d{3}-\d{3}-\d{4} 

pur includendo il riferimento nella nota dalla terza riga del primo profilo codice:

@Pattern(regexp = "{ContactInfo.workPhone.regexp}", message = "{ContactInfo.workPhone.regexp.msg}") 

avrei quindi passare i file di proprietà per le occasioni differenti, tali da consentire/richiedere una formato numerico telefonico non statunitense.

Domanda: È possibile fare ciò che voglio fare? C'è un modo migliore per specificare il modello (che potrebbe consentire anche una chiamata al database invece di un file delle proprietà)?

Inoltre, non sono il migliore in questo (dato che sto subentrando da un altro sviluppatore), quindi se qualcuno potrebbe semplicemente indicarmi una risorsa focalizzata sull'uso dell'annotazione @Pattern o altra convalida di regex di Hibernate markup, quindi potrebbe darmi tutte le informazioni di cui ho bisogno.

TL; DR: È possibile utilizzare un valore impostato in modo dinamico o modificato per l'espressione utilizzata in Convalida modello di ibernazione anziché una costante predefinita e precompilata?

risposta

3

All'interno delle annotazioni è possibile fare riferimento solo alle espressioni costanti, quindi il caricamento dei valori da un file di proprietà o da un database non funzionerebbe qui.

È possibile utilizzare API per la dichiarazione di vincoli dinamici introdotta in Hibernate Validator 4.2 che consente di definire i vincoli in fase di esecuzione. Il tuo esempio potrebbe sembrare che:

String dynamicPattern = ...; 

ConstraintMapping mapping = new ConstraintMapping(); 
mapping.type(ContactInfo.class) 
    .property("workPhone", FIELD) 
    .constraint(new PatternDef().regexp(dynamicPattern)); 

HibernateValidatorConfiguration config = 
    Validation.byProvider(HibernateValidator.class).configure(); 
config.addMapping(mapping); 

Validator validator = config.buildValidatorFactory().getValidator(); 
+0

La mia impressione è che i 3 'messaggi' nel mio esempio venivano chiamati in modo tale da permettere loro di essere cambiato senza ricompilare - forse questo non è il caso (Mi rifugio l'ho testato) - sembra promettente, ma si basa su diverse cose che non capisco ancora - dovrò provarlo con le dita incrociate - Grazie! –

+0

Ho esitato a contrassegnare come risposta perché non ho ancora avuto la possibilità di testare nulla - mi è stato detto che stiamo procedendo usando solo annotazioni (credo perché sono carine ??) ...sembra molto promettente, però, quindi almeno un +1 - Grazie per il tuo tempo! forse avrò il tempo di tornare ad un certo punto e testarlo davvero, o forse voglio solo contare le mie "risposte accettate" (chissà?) e tornerò ad accettarlo: D –