2011-01-21 6 views
14

私はGrailsを使い始めていますが、ここでは最初の問題です。ドメインオブジェクトの保存時にGrailsがエラーを通知しないのはなぜですか?

ドメインオブジェクトがすべてのプロパティが設定されるまで、DBに挿入できないことを確認するのに数時間を費やしました。

class Item { 
    String title 
    String link 
} 

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

論理的に見えますが、なぜそれが黙ってスキップされるのですか?そのような場合に例外を得るために何かを設定することはできますか?

おかげ

答えて

29

デフォルトで例外はスローされません。

ドメインクラスに注入されたsave()メソッドは、検証段階でエラーが発生した場合はfalseを返します。 ドメインクラスの/更新保存チェックするための古典的なコードサンプルは次のとおりです。検証の失敗のため

myDomainObj.save(failOnError: true) 

と例外:

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

あなたは、特定のドメインクラスの例外を持っている必要がある場合は、使用スローされます。

あなたはすべてのドメインクラスの例外をスローする場合は、単にtruegrails.gorm.failOnErrorを設定でGrailsのアプリ/ confに/ Config.groovy

は気をつけてください:すべてのドメインのプロパティは、暗黙のnullable: false制約を持っています。

this articleを読むことをお勧めします。

+0

'grails.gorm.failOnError = true'をありがとうございます。 IMHOデフォルトにする必要があります。いずれにせよ、これは私が使いたいものを完全に補うものです: 'grails.gorm.default.constraints = {'*' nullable:true}'制約ブロックは**いくつかのフィールドは必要であり、持ち上げることはありません。 – Tobia

+0

理想的には、IMHO、Grailsはデフォルトで 'belongsTo'フィールドを必要とし、その他のものは任意にする必要があります。 – Tobia

2

あなたsave()呼び出しがRuntimeExceptionを投げるようにするには、あなたはitem.save(failOnError:true)を使用することができます。しかし、save()メソッドの戻り値を確認することもできます。それが偽であれば、それは何かが間違っていることを意味します。

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

aha、idを返します。 nullはここで何も意味しないと思った。ありがとう! – mkuzmin

関連する問題