2012-08-27 43 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