【发布时间】:2012-10-12 07:29:55
【问题描述】:
我目前正在开发 Grails 应用程序,并且正在使用 Spring Security 和 UI 插件。我已经创建了用户类和我拥有的另一个区域类之间的关系,如下所示:
用户类别:
class User {
transient springSecurityService
String username
String email
String password
boolean enabled
boolean accountExpired
boolean accountLocked
boolean passwordExpired
static belongsTo = [area:Areas]
.......
}
区域类别:
class Areas {
String name
static hasMany = [users:User]
}
从课程中可以看出,一个用户可以链接到一个区域,但一个区域可能有很多用户。这一切都很好,当我引导应用程序时,所有数据都会正确添加。但是,当我尝试使用表单创建新用户时出现以下错误:
object references an unsaved transient instance - save the transient instance before flushing: com.website.Area
下面是我用来保存信息的控制器代码:
def save = {
def user = lookupUserClass().newInstance(params)
if (params.password) {
String salt = saltSource instanceof NullSaltSource ? null : params.username
user.password = springSecurityUiService.encodePassword(params.password, salt)
}
if (!user.save(flush: true)) {
render view: 'create', model: [user: user, authorityList: sortedRoles()]
return
}
addRoles(user)
flash.message = "${message(code: 'default.created.message', args: [message(code: 'user.label', default: 'User'), user.id])}"
redirect action: edit, id: user.id
}
以下是 GSP 的示例:
<table>
<tbody>
<s2ui:textFieldRow name='username' labelCode='user.username.label' bean="${user}"
labelCodeDefault='Username' value="${user?.username}"/>
<s2ui:passwordFieldRow name='password' labelCode='user.password.label' bean="${user}"
labelCodeDefault='Password' value="${user?.password}"/>
<s2ui:textFieldRow name='email' labelCode='user.email.label' bean="${user}"
labelCodeDefault='E-Mail' value="${user?.email}"/>
<s2ui:textFieldRow readonly='yes' name='area.name' labelCode='user.area.label' bean="${user}"
labelCodeDefault='Department' value="${area.name}"/>
<s2ui:checkboxRow name='enabled' labelCode='user.enabled.label' bean="${user}"
labelCodeDefault='Enabled' value="${user?.enabled}"/>
<s2ui:checkboxRow name='accountExpired' labelCode='user.accountExpired.label' bean="${user}"
labelCodeDefault='Account Expired' value="${user?.accountExpired}"/>
<s2ui:checkboxRow name='accountLocked' labelCode='user.accountLocked.label' bean="${user}"
labelCodeDefault='Account Locked' value="${user?.accountLocked}"/>
<s2ui:checkboxRow name='passwordExpired' labelCode='user.passwordExpired.label' bean="${user}"
labelCodeDefault='Password Expired' value="${user?.passwordExpired}"/>
</tbody>
</table>
我已经对此进行了研究,我相信这是我尝试保存 GORM 对象的方式,我应该在尝试保存用户之前保存父级(区域)。但是,在创建用户之前,区域总是存在的,所以我不需要再次创建区域,我该如何处理?我也尝试了“withTransaction”功能,但收效甚微
如果可能的话,我非常感谢您的帮助。
谢谢
编辑……
我已在 Controller 中将问题跟踪到这一行:
RegistrationCode registrationCode = springSecurityUiService.register(user, command.password, salt)
这告诉我这个函数正在为用户对象调用一个保存函数,但是在关系到位后,它需要先保存区域。有谁知道 SpringSecurityUi 可以帮助我解决这个问题?
谢谢
【问题讨论】:
-
把 springsecurityservice 放在控制器中,而不是域类中。
-
你能给我举个例子吗?因为 springsecurityservice 一直存在
-
错误是否与错误所说的“com.website.Area”类无关?谢谢
-
对不起,我没有阅读详细信息...当然它会在用户域类中。您可能导入了错误的区域,请检查您的导入和包名。
-
该区域被填充到一个下拉列表中,其中确实包含正确的内容。当我尝试保存数据时会出现问题,我相信它与 GORM 的工作方式有关。请问有什么想法吗?我真的可以使用帮助:-)
标签: grails grails-orm save domain-model