2011-01-21 12 views
14

Sto appena iniziando con Grails, ed ecco il primo numero.Perché Grail non mi notifica errore di salvataggio dell'oggetto dominio?

Ho trascorso diverse ore per scoprire che l'oggetto dominio non può essere inserito nel DB, finché non vengono popolate tutte le sue proprietà.

class Item { 
    String title 
    String link 
} 

class ItemController { 
    def fetch = { 
    def item = new Item() 
    item.title = "blabla" 
    // no value for "link" 
    item.save() 
    } 
} 

Sembra logico, ma perché è saltato così in silenzio? Posso configurare qualcosa per ottenere eccezioni in questi casi?

Grazie

risposta

29

Nessuna eccezione viene generata per impostazione predefinita.

Il metodo save() immesso nelle classi Dominio restituisce false se si è verificato un errore durante la fase di convalida. Un campione classico codice per la verifica di salvataggio/aggiornamento di una classe di dominio è:

if (!myDomainObj.save()) { 
    log.warn myDomainObj.errors.allErrors.join(' \n') //each error is an instance of org.springframework.validation.FieldError  
} 

Se è necessario disporre di un'eccezione per una particolare classe di dominio, l'uso:

myDomainObj.save(failOnError: true) 

e le eccezioni per errori di convalida sarà lanciato.

Se si desidera generare un'eccezione per ogni classi di dominio, quindi è sufficiente impostare grails.gorm.failOnError a true in graal-app/conf/Config.groovy

Attenzione: tutte le proprietà di dominio hanno un implicito nullable: false vincolo.

Ti consiglio di leggere this article.

+0

Grazie per 'grails.gorm.failOnError = true'. IMHO dovrebbe essere l'impostazione predefinita. In ogni caso è un perfetto complemento a questo che mi piace usare: 'grails.gorm.default.constraints = {'*' nullable: true}' Il blocco dei vincoli dovrebbe essere usato per ** aggiungere ** vincoli, come alcuni campi sono richiesti, non per sollevarli. – Tobia

+0

Idealmente, IMHO, Grails dovrebbe rendere i campi 'belongsTo' richiesti per impostazione predefinita, e tutti gli altri facoltativi. – Tobia

2

Per rendere la vostra chiamata save() gettare un RuntimeException, è possibile utilizzare item.save(failOnError:true). Ma puoi anche controllare il valore di ritorno del metodo save(). Se è falso, significa che è successo qualcosa di sbagliato.

if (item.save()) { 
    //succeeded 
} 
else { 
    //not succeeded 
} 
+0

aha, restituisce l'id. Pensavo che nulla significasse nulla qui. Grazie! – mkuzmin

Problemi correlati