我正在使用Spring Security Plugin来管理我的Grails应用程序中的成员资格和身份验证。
我正在尝试通过一对一关联将User域类与Profile域相关联。
我在User.groovy上添加了这些行:
static hasOne = [userProfile:UserProfile]
static constraints = {
//...
userProfile unique:true
}
和UserProfile.groovy:
User user
唉,我在调用UseRole.create(用户,角色)时遇到错误。
如何获得我正在寻找的相同功能,有一些最佳实践。特别是,我想将任何用户与一个配置文件对象相关联以扩展它。
我还希望在帖子和其他表格中添加一对多的关系...
由于 最好的问候
PS: 我得到了这个错误:
配置Spring Security UI ... 2011-03-08 12:18:51,179 [main] ERROR context.GrailsContextLoader - 执行bootstraps时出错:null 显示java.lang.NullPointerException 在$ Proxy19.save(未知来源) 在com.dromedian.xxxxx.security.UserRole.create(UserRole.groovy:32) 在com.dromedian.xxxxx.security.UserRole $ create.call(未知来源) 在BootStrap $ _closure1.doCall(BootStrap.groovy:20) at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:251) at grails.util.Environment.executeForEnvironment(Environment.java:244) at grails.util.Environment.executeForCurrentEnvironment(Environment.java:220) 在org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212) at grails.web.container.EmbeddableServer $ start.call(Unknown Source) 在_GrailsRun_groovy $ _run_closure5_closure12.doCall(_GrailsRun_groovy:158) at _GrailsRun_groovy $ _run_closure5_closure12.doCall(_GrailsRun_groovy) at _GrailsSettings_groovy $ _run_closure10.doCall(_GrailsSettings_groovy:280) at _GrailsSettings_groovy $ _run_closure10.call(_GrailsSettings_groovy) 在_GrailsRun_groovy $ _run_closure5.doCall(_GrailsRun_groovy:149) at _GrailsRun_groovy $ _run_closure5.call(_GrailsRun_groovy) 在_GrailsRun_groovy.runInline(_GrailsRun_groovy:116) 在_GrailsRun_groovy.this $ 4 $ runInline(_GrailsRun_groovy) 在_GrailsRun_groovy $ _run_closure1.doCall(_GrailsRun_groovy:59) 在RunApp $ _run_closure1.doCall(RunApp.groovy:33) at gant.Gant $ _dispatch_closure5.doCall(Gant.groovy:381) at gant.Gant $ _dispatch_closure7.doCall(Gant.groovy:415) at gant.Gant $ _dispatch_closure7.doCall(Gant.groovy) 在gant.Gant.withBuildListeners(Gant.groovy:427) at gant.Gant.this $ 2 $ withBuildListeners(Gant.groovy) at gant.Gant $ this $ 2 $ withBuildListeners.callCurrent(Unknown Source) 在gant.Gant.dispatch(Gant.groovy:415) 在Gant.Gant.this $ 2 $ dispatch(Gant.groovy) at gant.Gant.invokeMethod(Gant.groovy) at gant.Gant.executeTargets(Gant.groovy:590) at gant.Gant.executeTargets(Gant.groovy:589) 应用程序上下文关闭...
配置为:
User.groovy(Spring安全插件创建的域类)
static hasOne = [userDetail:UserDetail]
static constraints = {
username blank: false, unique: true
password blank: false
userDetail unique:true
}
UserDetail.groovy
static hasOne = [user:User]
static belongsTo = User
BootStrap.groovy中
//TODO temporary added - no for production or persistent db
def adminRole = new Role(authority: 'ROLE_ADMIN').save(flush: true)
def userRole = new Role(authority: 'ROLE_USER').save(flush: true)
String password = springSecurityService.encodePassword('password')
def testUser = new User(username: 'me', enabled: true, password: password)
testUser.save(flush: true)
if(testUser != null){
UserRole.create testUser, adminRole, true
}
如果我不打电话
UserRole.create testUser, adminRole, true
没有错误。我试图调试,但我可以理解错误在哪里。
答案 0 :(得分:1)
如前所述,您的测试用户未保存,因为需要用户个人资料。用户的save方法将返回null,但是,您不检查该方法。 我通常在这些方面放一个方法:
def ensureSave(domainObject) {
if(!domainObject.save(flush:true)) {
throw new Exception("not saved successfully: $domainObject");
}
domainObject
}
然后参考如下:
ensureSave(testUser)
或
testUser = ensureSave(new User(...));
HTH
答案 1 :(得分:0)
我认为你必须在构造函数中设置UserProfile。由于您没有提供,因此save()失败,从而为您提供NullPointerException
。
UserDetail profile = new UserDetail()
def testUser = new User(username: 'me', enabled: true, password: password, userdetail: profile)
assert testUser.save()
断言.save()调用已经证明非常有用,因为当您更改域类中的某些代码时,如果您忘记更改它们,那么构造函数将无法在引导程序文件中运行。由于grails处理相当优雅,你得到奇怪的错误,而不是得到最有帮助的消息。通过放置断言,它将直接停在问题所在的位置。
答案 2 :(得分:0)
我刚遇到了类似的问题......并推断出这个:
必须明确允许您的链接类为null ...即:
static constraints = {
...
userDetail unique:true, nullable: true
...
}
如果你不这样做,你的类的构造函数调用失败(正如其他人指出的那样,尝试在null上创建UserRole失败)