我试图在grails中使用Spring Security OpenID插件。我使用提供的脚本来生成各种类,并且在Config.groovy中包含以下内容:

grails.plugins.springsecurity.userLookup.userDomainClassName = 'net.example.manager.User' 
grails.plugins.springsecurity.userLookup.authorityJoinClassName = 'net.example.manager.UserRole' 
grails.plugins.springsecurity.authority.className = 'net.example.manager.Role' 
grails.plugins.springsecurity.openid.domainClass = 'net.example.manager.OpenID' 

当我运行grails run-app时,出现以下错误:
[main] ERROR context.GrailsContextLoader  - Error executing bootstraps: Cannot invoke method newInstance() on null object 
java.lang.NullPointerException: Cannot invoke method newInstance() on null object 
at SpringSecurityOpenidGrailsPlugin$_closure2.doCall(SpringSecurityOpenidGrailsPlugin.groovy:140) 
at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212) 
at grails.web.container.EmbeddableServer$start.call(Unknown Source) 
at _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) 
at _GrailsRun_groovy$_run_closure5.doCall(_GrailsRun_groovy:149) 
at _GrailsRun_groovy$_run_closure5.call(_GrailsRun_groovy) 
at _GrailsRun_groovy.runInline(_GrailsRun_groovy:116) 
at _GrailsRun_groovy.this$4$runInline(_GrailsRun_groovy) 
at _GrailsRun_groovy$_run_closure1.doCall(_GrailsRun_groovy:59) 
at 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) 
at gant.Gant.withBuildListeners(Gant.groovy:427) 
at gant.Gant.this$2$withBuildListeners(Gant.groovy) 
at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source) 
at gant.Gant.dispatch(Gant.groovy:415) 
at 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) 

我在OpenID插件的源代码中将此错误跟踪到了该区域(错误发生在最后一行):
String userClassName = conf.userLookup.userDomainClassName 
def userClass = ctx.grailsApplication.getClassForName(userClassName) 
String openIdsPropertyName = conf.openid.userLookup.openIdsPropertyName 
if (openIdsPropertyName && !userClass.newInstance().hasProperty(openIdsPropertyName)) 

我的域类存在,但是由于某种原因grails无法获得该类,我也不知道为什么。

请您参考如下方法:

我有同样的问题,尽管我的错误消息要短得多。无论出于何种原因,对“conf.userLookup.userDomainClassName”的调用均正确返回了类名,并且与该类完全匹配,但“ctx.grailsApplication.getClassForName(userClassName)”返回了null。对我而言,这仅在本地运行时发生。当我推送到远程分支并运行它时,我没有任何问题。

我通过避免调用“getForClassName”来解决此问题。我将以下行添加到了Config.groovy文件中:

grails.plugins.springsecurity.userLookup.userDomainClass = mypackage.User; 

并在我的SpringSecurityOpenidGrailsPlugin.groovy文件中进行了以下更改:
// The old way this was done was breaking when run locally for some reason. 
//String userClassName = conf.userLookup.userDomainClassName 
//def userClass = ctx.grailsApplication.getClassForName(userClassName) 
// 
// So I replaced it with this: 
Class userClass = conf.userLookup.userDomainClass; 

现在运行正常。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!