NPE в Spring Security OpenID Плагин начальной загрузки - PullRequest
2 голосов
/ 09 августа 2011

Я пытаюсь использовать плагин Spring Security OpenID в Grails. Я использовал предоставленные сценарии для генерации различных классов, и у меня в 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 не может получить класс, и я понятия не имею, почему.

1 Ответ

0 голосов
/ 04 декабря 2013

У меня была такая же проблема, хотя у меня было намного более короткое сообщение об ошибке.По какой-либо причине вызов conf.userLookup.userDomainClassName вернул имя класса правильно, и оно полностью соответствует классу, но ctx.grailsApplication.getClassForName (userClassName) вернул ноль.Для меня это произошло только при локальном запуске.Когда я нажал на свою удаленную ветку и запустил ее там, у меня не было проблем.

Я исправил это, избегая вызова 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;

Теперь он работает нормально.

...