Grails - MongoDB和自定义脏检查

时间:2012-05-09 14:42:08

标签: mongodb grails grails-domain-class

我在我的应用程序上使用MongoDB和Spring Security Core和UI。 除了这一点,几乎所有东西都完美无缺:

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

是User域类的一部分。我已经读过MongoDB插件不支持脏检查。所以我试着像这样实现自己:

if ( User.collection.findOne(id:id).password != password ) {
            encodePassword()
        } 

但它不起作用。我得到了经典的Cannot get property 'password' on null object.

有没有人知道如何从域类定义中引用实例? 我也愿意更好地实现脏检查。

4 个答案:

答案 0 :(得分:2)

也许findOne返回null?你试过了吗?

def existing = User.collection.findOne(id:id)?.password 
if ( !existing || existing != password ) 

答案 1 :(得分:0)

我刚刚遇到同样的问题,直到动态方法工作,这将不得不这样做:

def mongo
def beforeUpdate() {
    def persisted = mongo.getDB("test").user.findOne(id).password
    def encodedNew = springSecurityService.encodePassword(password)
    if(persisted != encodedNew) password = encodedNew
    //if (isDirty('password')) {
    //  encodePassword()
    //}
}

答案 2 :(得分:0)

User.collection.findOne(_id:id).password

答案 3 :(得分:0)

我也在努力解决这个问题 - 这是我的解决方案:

def beforeUpdate() {
    User.withNewSession {
        def user = User.findByUsername(this.username)
        if ( !user?.password || user?.password != password) {
            encodePassword()
        }
    }
}

如果有更有效的方式,请告诉我。