我正在使用Spring Security插件来管理Grails应用程序中的成员资格和身份验证。
我试图通过一对一关联将User域类与Profile域相关联。
我在User.groovy上添加了以下行:
static hasOne = [userProfile:UserProfile]
static constraints = {
//...
userProfile unique:true
}
并转到UserProfile.groovy:
User user
las,调用UseRole.create(user,role)时出现错误。
有一些关于如何获得所需功能的最佳实践。特别是,我想将任何用户与一个配置文件对象关联以扩展它。
然后,我还要添加与帖子和其他表格的一对多关系。
谢谢
最好的祝福
PS:
我收到此错误:
配置Spring Security UI ...
2011-03-08 12:18:51,179 [main]错误context.GrailsContextLoader-执行 bootstrap 时出错: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)
在grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:251)
在grails.util.Environment.executeForEnvironment(Environment.java:244)
在grails.util.Environment.executeForCurrentEnvironment(Environment.java:220)
在org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212)
在grails.web.container.EmbeddableServer $ start.call(未知来源)
在_GrailsRun_groovy $ _run_closure5_closure12.doCall(_GrailsRun_groovy:158)
在_GrailsRun_groovy $ _run_closure5_closure12.doCall(_GrailsRun_groovy)
在_GrailsSettings_groovy $ _run_closure10.doCall(_GrailsSettings_groovy:280)
在_GrailsSettings_groovy $ _run_closure10.call(_GrailsSettings_groovy)
在_GrailsRun_groovy $ _run_closure5.doCall(_GrailsRun_groovy:149)
在_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)
在gant.Gant $ _dispatch_closure5.doCall(Gant.groovy:381)
在gant.Gant $ _dispatch_closure7.doCall(Gant.groovy:415)
在gant.Gant $ _dispatch_closure7.doCall(Gant.groovy)
在gant.Gant.withBuildListeners(Gant.groovy:427)
在gant.Gant.this $ 2 $ withBuildListeners(Gant.groovy)
at gant.Gant $ this $ 2 $ withBuildListeners.callCurrent(未知来源)
在gant.Gant.dispatch(Gant.groovy:415)
在gant.Gant.this $ 2 $ dispatch(Gant.groovy)
在gant.Gant.invokeMethod(Gant.groovy)
在gant.Gant.executeTargets(Gant.groovy:590)
在gant.Gant.executeTargets(Gant.groovy:589)
应用程序上下文正在关闭...
配置为:
User.groovy(由Spring Security插件创建的域类)
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
没有错误。我尝试调试,但是我可以理解错误在哪里。
最佳答案
如前所述,由于需要用户配置文件,因此不会保存您的测试用户。用户的save方法将返回null,但是,您无需对此进行检查。
我通常在以下方面写一个方法:
def ensureSave(domainObject) {
if(!domainObject.save(flush:true)) {
throw new Exception("not saved successfully: $domainObject");
}
domainObject
}
然后参考如下:
ensureSave(testUser)
要么
testUser = ensureSave(new User(...));
高温超导