我正在尝试在我的用户域类中使用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 请帮帮我。谢谢
答案 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
}