beforeInsert没有在grails + mongodb中触发

时间:2013-01-24 01:14:42

标签: mongodb grails gorm

看起来从不触发beforeInsert并且密码在DB中以纯文本形式存储,我有一个像这样的用户域类:

class User {

    String email
    String name
    String surname
    String phone
    String password

    static constraints = {
        email(blank:false, email:true, unique:true)
        name(blank:false)
        surname(blank:false)
        phone(blank:false)
        password(blank:false, password:true)
    }

    def beforeInsert = { encodePassword() }

    def beforeUpdate() {
        if (isDirty('password')) {
            encodePassword()
        }
    }

    protected void encodePassword() {
        password = springSecurityService.encodePassword(password)
    }
}

知道我做错了什么?

提前致谢!

2 个答案:

答案 0 :(得分:2)

这很奇怪,我不知道为什么,但这有效,我将beforeInsert var更改为方法,并添加了瞬态springSecurityService

class User {

    transient springSecurityService

    String email
    String name
    String surname
    String phone
    String password

    static constraints = {
        email(blank:false, email:true, unique:true)
        name(blank:false)
        surname(blank:false)
        phone(blank:false)
        password(blank:false, password:true)
    }

    def beforeInsert() {
        encodePassword()
    }

    def beforeUpdate() {
        if (isDirty('password')) {
            encodePassword()
        }
    }

    protected void encodePassword() {
        password = springSecurityService.encodePassword(password)
    }
}

答案 1 :(得分:2)

您似乎错过了User类定义中springSecurityService的声明(如@gurbieta所观察到的):

transient springSecurityService
BTW,beforeUpdate方法也需要一些修改。 mongodb gorm插件不支持dirty检查方法。请参阅doc中的1.1 Compatibility with GORM for Hibernate

所以你必须修改

if (isDirty('password')) {

以其他方法检查密码是否已更改。

相关问题