Grails - beforeInsert在条目中抛出异常null id

时间:2012-08-27 12:43:09

标签: grails-domain-class grails-2.0

我正在尝试在我的用户域类中使用beforeInsert。

 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:条目中的null id(发生异常后不刷新Session),当域对象save方法遇到SQL异常时

我在auto timestamping的文档中读到了这一点 不要尝试在事件中刷新会话(例如使用obj.save(flush:true))。由于在刷新期间触发事件,这将导致StackOverflowError。

在这种情况下如何保存userInstance.save(flush: true)我尝试删除flush:true,但我仍然遇到同样的错误。如果我删除flus:true..then当我需要打电话。当hibenate将清除所有这些记录。

我尝试了定义的解决方案this JIRA ticket  请帮帮我。谢谢

3 个答案:

答案 0 :(得分:1)

您是否有其他验证错误?

如果您将代码放在beforeValidate方法中,它将起作用:

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

我想我来不及帮助你,但我希望它可以帮助其他人解决同样的问题。

问候,Urs

答案 1 :(得分:0)

更改您的

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

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

这应该可以解决问题

答案 2 :(得分:0)

我相信如果beforeInsert方法返回false,那么你在条目#34中得到" null id;例外。也许这被视为验证失败的指示。

e.g。以下将导致异常

def beforeInsert() {
  flag = false
}

然而以下应该可以正常工作

def beforeInsert() {
  flag = false
  return true
}