启动时填充列表的奇怪Grails行为
我对一种奇怪的Grails行为发疯了 我得到一个域类用户:启动时填充列表的奇怪Grails行为,grails,gorm,Grails,Gorm,我对一种奇怪的Grails行为发疯了 我得到一个域类用户: class User { String firstName String token List roles = [] as List static constraints = { } } 我这样修改BootStrap.groovy以填充5个用户实例: class BootStrap { def init = { servletContext -> switch
class User {
String firstName
String token
List roles = [] as List
static constraints = {
}
}
我这样修改BootStrap.groovy以填充5个用户实例:
class BootStrap {
def init = { servletContext ->
switch (Environment.getCurrent()) {
case 'DEVELOPMENT':
def user1 = new User(
id: 1,
firstName: 'Enricot',
token: 'L\'abricot'
)
user1.roles.add('ROLE_USER')
user1.save(failOnError: true)
def user2 = new User(
id: 2,
firstName: 'Arnaud',
token: 'Dauphin')
user2.roles.add('ROLE_USER')
user2.roles.add('PERM_WRITE')
user2.save(failOnError: true)
def user3 = new User(
id: 3,
firstName: 'Magalie',
token: 'La banane')
user3.roles.add('ROLE_USER')
user3.roles.add('PERM_READ')
user3.save(failOnError: true)
def user4 = new User(
id: 4,
firstName: 'Jeremy',
token: 'Wistiti')
user4.roles.add('ROLE_USER')
user4.roles.add('ROLE_ADMIN')
user4.save(failOnError: true)
def user5 = new User(
id: 5,
firstName: 'Jimini',
token: 'Criquet')
user5.roles.add('ROLE_USER')
user5.roles.add('ROLE_INTERACTIONS')
user5.save(failOnError: true)
break
case "test":
DataBuilder.init()
break
}
}
def destroy = {
}
}
在我的控制器中,当我得到一个用户时,所有字段都是正确的,除了列表
如果我这样做:
def user = User.get(1)
println user.firstName // Output is "Enricot"
println user.token // Output is "L'abricot"
println user.roles // Output is "[]" and not "[ROLE_USER]"
尝试这样填充对象并没有解决我的问题:
def user1 = new User(
id: 1,
firstName: 'Enricot',
token: 'L\'abricot',
roles: ['ROLE_USER']).save(failOnError: true)
我试过用双引号,简单的引号
最有趣的是,当我将user.roles转换为BootStrap.groovy时,我得到了正确的列表
这对我来说毫无意义,欢迎任何帮助,这是grails的正常行为。下面的代码只是将项目添加到当前对象的列表中!不连接到数据库引用:
user1.roles.add('ROLE_USER')
要添加到数据库的角色映射,请使用以下动态方法:
user1.addToRoles('ROLE_USER')
class User {
String firstName
String token
static hasMany = [roles: String]
}
假设:你的意思是你的领域
List<Strings> roles
static hasMany = [roles:String]
这不是奇怪的行为,你做错了: 当您添加一个想要持久化的字段时,需要向Grails提供关于如何存储它的信息。仅仅一个简单的列表是不够的。如果是其他域类的列表,它将创建一个外键并存储ID。如果是字符串列表,则将它们存储为varchar。如图所示,您需要执行以下操作:
user1.addToRoles('ROLE_USER')
class User {
String firstName
String token
static hasMany = [roles: String]
}
这会将备份集合更改为一个集合,但对于角色来说,这可能是正确的,因为您不关心排序,也不需要唯一性。如果确实需要排序,请添加一个未初始化的列表字段,以向Grails发出不需要集合的信号:
这将更改填充数据的方式。使用为您添加的dynamic addToRoles方法,而不是直接添加到集合中:
class BootStrap {
def init = { ctx ->
environments {
development {
def user1 = new User(firstName: 'Enricot', token: 'L\'abricot')
user1.addToRoles('ROLE_USER')
user1.save(failOnError: true)
def user2 = new User(firstName: 'Arnaud', token: 'Dauphin')
user2.addToRoles('ROLE_USER')
user2.addToRoles('PERM_WRITE')
user2.save(failOnError: true)
def user3 = new User(firstName: 'Magalie', token: 'La banane')
user3.addToRoles('ROLE_USER')
user3.addToRoles('PERM_READ')
user3.save(failOnError: true)
def user4 = new User(firstName: 'Jeremy', token: 'Wistiti')
user4.addToRoles('ROLE_USER')
user4.addToRoles('ROLE_ADMIN')
user4.save(failOnError: true)
def user5 = new User(firstName: 'Jimini', token: 'Criquet')
user5.addToRoles('ROLE_USER')
user5.addToRoles('ROLE_INTERACTIONS')
user5.save(failOnError: true)
}
test {
DataBuilder.init()
}
}
}
}
有关BootStrap.groovy中环境块支持的信息,请参阅
还请注意,我删除了您的显式id值,因为您没有使用指定的id,所以这些值将被忽略
最后,看起来你在使用自己的安全机制。不要这样做。使用经验证的框架。和都功能强大,易于入门。仅供参考,您不必这样做。只做环境{开发{}测试{}生产{}