2011-01-21 1 views
14

Je ne fais que commencer avec Grails, et voici le premier numéro.Pourquoi Grails ne m'avertit-il pas de l'erreur lors de la sauvegarde de l'objet de domaine?

J'ai passé plusieurs heures à découvrir que l'objet de domaine ne peut pas être inséré dans DB, jusqu'à ce que toutes ses propriétés soient remplies.

class Item { 
    String title 
    String link 
} 

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

Cela semble logique, mais pourquoi est-il ignoré? Puis-je configurer quelque chose pour obtenir des exceptions dans de tels cas?

Merci

Répondre

29

Aucune exception n'est levée par défaut.

La méthode save() injectée dans les classes Domain renvoie false si une erreur s'est produite au cours de la phase de validation. Un exemple de code classique pour le contrôle de sauvegarde/mise à jour d'une classe de domaine est:

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

Si vous devez avoir une exception pour une classe de domaine particulier, utilisez:

myDomainObj.save(failOnError: true) 

et exceptions pour les échecs de validation sera jeté.

Si vous voulez lancer une exception pour chaque classe de domaine, puis simplement mettre grails.gorm.failOnError à true dans Grails-app/conf/Config.groovy

Attention: toutes les propriétés de domaine ont une contrainte nullable: false implicite. Je recommande que vous lisiez this article.

+0

Merci pour 'grails.gorm.failOnError = true'. À mon humble avis, il devrait être la valeur par défaut. En tout cas, c'est un complément parfait à celui-ci que j'aime utiliser: 'grails.gorm.default.constraints = {'*' nullable: true}' Le bloc de contraintes devrait être utilisé pour ** ajouter ** des contraintes, telles que un certain champ étant requis, ne pas les soulever. – Tobia

+0

Idéalement, à mon humble avis, Grails devrait rendre les champs 'belongsTo' requis par défaut, et tous les autres facultatifs. – Tobia

2

Pour faire votre appel save() jeter un RuntimeException, vous pouvez utiliser item.save(failOnError:true). Mais vous pouvez également vérifier la valeur de retour de la méthode save(). Si c'est faux, cela signifie que quelque chose de mal est arrivé.

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

aha, ça renvoie l'identifiant. Je pensais que null ne veut rien dire ici. Merci! – mkuzmin

Questions connexes