2010-11-02 4 views
8

Sono un novizio in graal e groovy. Ho una classe dominio di progetto con data di inizio e di fine. Voglio inserire un vincolo che specifica che la data di fine deve essere maggiore della data di inizio (e successivamente un altro oggetto figlio del progetto deve avere la sua data di inizio e di fine validità convalidare con le date del progetto principale). È possibile con il vincolo minimo o devo metterlo altrove? Il vincolo univoco consente a due proprietà di essere collegate in questo modo, sperando che i vincoli min/max lo consentano. Ho provatoLimite minimo grails per la convalida della data

startDate(blank:false) 
endDate(blank:false, min:'startDate') 

Si genera un errore dicendo che lo startDate proprietà non è disponibile su Project

+0

La mia risposta presuppone che 'endDate' sia definito come' java.util.Date'. È corretto? In caso contrario, si prega di specificare di cosa si tratta e aggiornerò la mia risposta di conseguenza. –

+0

Sì, è una data normale. Speravo che il vincolo minimo si applicasse anche a quello ... Grazie per la risposta :) Quindi, min si applica solo agli interi, giusto? –

+0

Bene, 'min' può essere applicato bene ai valori di 'Date'. Tuttavia, non credo che si possa usare un valore dinamico (cioè un altro valore di campo) nella definizione del vincolo per 'min' poiché' constraints' è una chiusura statica. Si potrebbe fare 'endDate (min: new Date())', però, senza problemi. –

risposta

13

provare a utilizzare un validatore personalizzato:

static constraints = { 
    endDate(validator: { val, obj -> 
     val?.after(obj.startDate) 
    }) 
} 

val è il valore del campo e obj è un riferimento all'oggetto che viene convalidato. La chiusura può contenere qualsiasi logica tu abbia bisogno, così puoi estendere la tua convalida nel modo in cui descrivi nella tua domanda (accedendo agli oggetti figli a cui fai riferimento usando obj).

Il validatore personalizzato è piuttosto flessibile. Dai un'occhiata a the documentation. Idealmente vorrai restituire un messaggio personalizzato; come farlo si può trovare anche nei documenti collegati sopra.