2012-08-27 83 views
1

我想在我的用戶域類中使用beforeInsert。Grails - beforeInsert在條目中拋出異常null id

class User { 

    String reEnterPassword 

    static constraints = { 

     password(blank: false, nullable: false, size:5..50, validator: {password, obj -> 
     def reEnterPassword = obj.properties['reEnterPassword'] 
     if(reEnterPassword == null) return true 
     reEnterPassword == password ? true : ['invalid.matchingpasswords'] 
     }) 
     reEnterPassword(bindable:true, blank: false); 
    } 


    def beforeInsert = { 
     password = password.encodeAsSHA() 
     } 

    String toString(){ 
     name 
     } 


    static transients = ['reEnterPassword'] 

    } 
在我的控制器

我有保存方法(生成)

def save() { 
    def userInstance = new User(params) 
    if (!`userInstance.save(flush: true)`) { 
     render(view: "create", model: [userInstance: userInstance]) 
     return 
    } 

這是拋出異常 Grails的運行時異常,org.hibernate.AssertionFailure:空ID在條目(不刷新會議發生異常之後),域對象保存方法遇到SQL異常時

我在auto timestamping的文檔中看到 不要嘗試在事件內刷新會話(例如和obj.save一樣(flush:true))。由於事件在刷新期間被觸發,這將導致StackOverflowError。

在這種情況下如何保存我的userInstance.save(flush: true)我試圖刪除flush:true但我仍然得到相同的錯誤。如果我刪除flus:真..然後當我需要打電話。當hibenate將沖洗所有這些記錄。

我試過定義的解決方案this JIRA ticket 請幫我解決。謝謝

+0

任何需要回答問題的事情。請幫助我。謝謝 – vishnu

回答

0

更改

def beforeInsert = { 
    password = password.encodeAsSHA() 
} 

def beforeInsert() { 
    password = password.encodeAsSHA() 
} 

而且應該做的伎倆

+0

謝謝你的回答。但仍然在com.valuelabs.bets.User條目中獲取相同的錯誤類org.hibernate.AssertionFailure消息null id(發生異常後不刷新會話)。 – vishnu

0

我相信,如果beforeInsert方法返回false,那麼你在進入「空號「例外。也許這被認爲是驗證失敗的一個指標。

例如以下將導致異常

def beforeInsert() { 
    flag = false 
} 

但以下應該工作確定

def beforeInsert() { 
    flag = false 
    return true 
} 
1

它可以是你有其他的驗證錯誤?

如果你把你的代碼中beforeValidate方法。它將工作:

def beforeValidate = { 
    password = password.encodeAsSHA() 
} 

我想我來不及幫你,但我希望它能幫助其他有同樣問題。

Greetings,Urs