1

我正在尝试在我的用户域类中使用 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 in entry(异常发生后不要刷新Session),当域对象save方法遇到SQL异常时

我在文档中阅读了自动时间戳记,即不要尝试在事件中刷新会话(例如使用 obj.save(flush:true))。由于在刷新期间触发了事件,这将导致 StackOverflowError。

在这种情况下如何保存我的userInstance.save(flush: true)我试图删除flush:true但我仍然得到同样的错误。如果我删除flus:true..那么当我需要打电话时。当休眠将刷新所有这些记录。

我尝试了定义此 JIRA 票证的解决方案 ,请帮帮我。谢谢

4

3 回答 3

1

可能是您有其他验证错误吗?

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

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

我想我为时已晚,无法帮助您,但我希望它可以帮助其他有同样问题的人。

问候,乌尔斯

于 2013-01-23T08:23:50.440 回答
0

改变你的

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

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

这应该可以解决问题

于 2012-08-28T15:21:40.263 回答
0

I believe if the beforeInsert method return false then you get the "null id in entry" exception. Perhaps this is treated as an indication that validation has failed.

e.g. the following will cause the exception

def beforeInsert() {
  flag = false
}

however the following should work OK

def beforeInsert() {
  flag = false
  return true
}
于 2012-11-06T17:28:35.730 回答