如何在创建对象时设置用户ID号的值?

时间:2017-03-02 11:16:08

标签: grails spring-security grails-domain-class

我使用spring-security-core并希望使用创建它的用户的id标记新创建的对象。 我尝试使用以下代码,但即使我从getUserID返回一个常量,数据库中的值也始终为零。但是,DateCreated的默认设置有效。

class test {
    def springSecurityService

    Date        dateCreated
    int                 createdBy

    static mapping = { 
        dateCreated column: "dateCreated",     defaultValue: newDate()
        createdBy       column: "createdBy",       defaultValue: getUserID()
}

def getUserID() {
    def user = springSecurityService.isLoggedIn() ?
        springSecurityService.loadCurrentUser() :
        null
    return user.id
}

}

2 个答案:

答案 0 :(得分:1)

当我在DB中更新另一个字段dateCreated时,我在静态映射中设置值时,我无法解释为什么在数据库中createdBy的值为零。

但是我通过在" beforeInsert"中设置createdBy的值来解决我的问题。程序。 所以这是我的解决方案:

class Test
    Date        dateCreated
    int         createdBy 

    def beforeInsert() {
        createdBy = getUserID()
    }
    def int getUserID() {
        def user = springSecurityService.isLoggedIn() ?
            springSecurityService.loadCurrentUser() :
            null
        return user ? user.id: -1
    }
    static mapping = { 
        dateCreated column: "dateCreated",     defaultValue: newDate()
    }

}

答案 1 :(得分:0)

首先,字段“createdBy”应该显示哪个用户创建了这个对象,因此它存储在对象中。然后函数“getUserID”正在获取此ID。我尝试了很多不同的东西,这个解决方案就是有效的。正如已经说过的,我不知道为什么这不能

好的,但是你要存储一个int,它有一个进程来获取userId的长数并将其存储为整数值。

现在反过来每次你需要找到实际用户时你需要获得该id并执行User.get(createdBy)绑定到真正的User类 而不是

int createdBy

尝试

User createdBy

I don't know what you mean with "bind to actual user"

这意味着您将createdBy id绑定为域类中的真实对象,因此在查找时您已经拥有了用户对象,而无需对每个整数执行User.get。每个列表的大量数据库查找等与拥有真实对象相比,在数据库设计/上下文中没有真正的区别,它只是一个真实的对象与平面数字。

非常重要的一点

其次,我在每个域类中注入服务以自动设置用户的观点是非常昂贵的,真的没有必要。整个添加过程应该通过服务完成,在该调用中您只需执行userService.currentUser

听起来你在获取用户方面遇到了问题? class UserService {

def getCurrentUser() {
    def principal = springSecurityService?.principal
    String username = principal?.username
    if (username) {
        return find(username)
    }
}
def find(String user) {
    return User.findByUsername(user)
}

}

所以现在userService.currentUser将为您提供Spring安全性的实际用户对象

就dateCreated和lastUpdated而言,它们都是grails中的动态字段,不需要任何其他内容。默认情况下,只需要域类中的一个条目即可。它将自动设置这些值

希望你更清楚一点?