我在Grails 2.5.3中有一个系统,我在测试和生产环境中遇到了 Bootstrap 文件的问题。在 DEV环境中,初始数据加载工作正常。
使用的域类。 SecUser - Spring安全
class SecUser implements Serializable {
...
UUID id
Date dateCreated
String username
String password
String email
....
}
普通用户。 用户:
class User extends SecUser {
UUID id
String name
...
// Relations
static belongsTo = [department:Department]
static hasMany = [evaluations:Evaluation]
}
评价:
class Evaluation {
UUID id
Integer attemptNumber
Date completenessDate
Integer maxAttempt
String testName
Float testScore
// Relations
static belongsTo = [user:User]
}
我有以下代码来加载初始数据。对于所有三种环境,它都是相同的代码。 Dev工作得很好,但prod和test显示错误。
// Role
def adminRole = new SecRole(authority: 'ROLE_ADMIN')
def userRole = new SecRole(authority: 'ROLE_USER')
// Administrator
def newAdmin = new SecUser(
username: 'admin',
password: 'admin',
email: 'admin@example.com')
// Department
def idDepartment = new Department(name: 'I+D')
// Normal user
def newUser = new User(
username: 'user',
password: 'user',
email: 'user@example.com',
name: 'userTest',
department: idDepartment
)
// Evaluation
def evalUser = new Evaluation(
testName: 'Test example',
attemptNumber: 1,
maxAttempt: 2,
completenessDate: new Date(),
testScore: 7.55,
user: newUser)
// Saving roles
adminRole.save(flush: true, failOnError: true)
userRole.save(flush: true, failOnError: true)
// Saving new admin
newAdmin.save(flush: true, failOnError: true)
// Saving departments
idDepartment.save(flush: true, failOnError: true)
// Saving new users
newUser.save(flush: true, failOnError: true)
// Assign user to role
if (!newAdmin.authorities.contains(adminRole)) {
SecUserSecRole.create newAdmin, adminRole, true
}
if (!newUser.authorities.contains(userRole)) {
SecUserSecRole.create newUser, userRole, true
}
// Saving evaluations - HERE IS THE ERROR
evalUserSTT1.save(flush: true, failOnError: true)
仅在测试和prod环境中显示的错误如下。我不知道为什么开发环境不会失败,其他环境因此违规而失败。
答案 0 :(得分:0)
这是因为在开发环境中,数据源配置设置为dbCreate =“create-drop”,这意味着每次重新启动应用程序时,它都会丢弃,然后重新创建数据库。但是,在测试和生产环境中,将设置为dbCreate =“update”,它仅更新新更改。现在基于您的引导代码,您不会在保存之前检查对象是否存在,因此引导代码将尝试创建相同的角色和第一次运行时已存在的用户,这会导致冲突。
总之,修改引导代码以检查记录是否已存在,这只是一个示例,但必须对其他角色和用户等执行相同操作,例如:
def adminRole
def adminRoleExists = SecRole.findByAuthority('ROLE_ADMIN')
if(!adminRoleExists ) {
adminRole = new SecRole(authority: 'ROLE_ADMIN')
adminRole.save(flush: true, failOnError: true)
}