【问题标题】:Saving a Grails GORM/Domain class results in a `NullPointerException`保存 Grails GORM/Domain 类会导致 `NullPointerException`
【发布时间】:2016-09-11 05:20:16
【问题描述】:

我有一个服务负责在成功填写注册页面时创建相关帐户层次结构:

    def userRole = Role.findByAuthority("ROLE_USER")
    final account = new Account(email: command.email, password: command.password)
    account.save(flush: true)

    final publisher = new Publisher(name: command.name) //, account: account)
    publisher.save(flush: true)

    final accountRole = AccountRole.create account, userRole

不管我做什么,AccountRole.create account, userRole 在这一行都失败了:

static AccountRole create(Account account, Role role) {
    def instance = new AccountRole(account: account, role: role)
    instance.save()  // throws NullPointerException
    instance
}

我尝试过new AccountRole(account: account, role: userRole),但是当我手动调用save 时也失败了。 AccountAccountRole 是由 Grails 3 Spring Security 插件生成(并稍作调整)的类。

这是失败的 AccountRole.create(...) 调用的堆栈跟踪:

java.lang.reflect.InvocationTargetException: null
    at grails.plugin.springsecurity.web.UpdateRequestContextHolderExceptionTranslationFilter.doFilter(UpdateRequestContextHolderExceptionTranslationFilter.groovy:64)
    at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.groovy:53)
    at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.groovy:62)
    at grails.plugin.springsecurity.web.SecurityRequestHolderFilter.doFilter(SecurityRequestHolderFilter.groovy:58)
    at grails.plugin.springsecurity.web.filter.DebugFilter.invokeWithWrappedRequest(DebugFilter.groovy:102)
    at grails.plugin.springsecurity.web.filter.DebugFilter.doFilter(DebugFilter.groovy:69)
    at grails.plugin.springsecurity.web.UpdateRequestContextHolderExceptionTranslationFilter.doFilter(UpdateRequestContextHolderExceptionTranslationFilter.groovy:64)
    at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.groovy:53)
    at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.groovy:62)
    at grails.plugin.springsecurity.web.SecurityRequestHolderFilter.doFilter(SecurityRequestHolderFilter.groovy:58)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: null
    at package.AccountRole.create(AccountRole.groovy:48)
    at package.RegistrationService.$tt__handleNewRegistration(RegistrationService.groovy:25)

版本信息:

| Grails Version: 3.1.5
| Groovy Version: 2.4.6
| JVM Version: 1.8.0_73

请把我从痛苦中拯救出来!我现在已经花了几个小时了:(

【问题讨论】:

  • 你能提供一个具有这种行为的示例应用程序吗?我只能处理你的域类不在正确的目录中,所以它实际上不是域类。
  • 这个例子的发布者部分似乎无关紧要......可能想把它拿出来。我也从未将“final”用于局部变量声明,尤其是那些会改变的声明(就像你“保存”时所做的那样)。

标签: grails spring-security grails-orm


【解决方案1】:

没有足够的信息可以确定,但instance 不太可能为空,因为您只是使用构造函数调用创建它,但您应该检查以确保,例如

static AccountRole create(Account account, Role role) {
   def instance = new AccountRole(account: account, role: role)
   println "instance null? ${instance == null}"
   instance.save()  // throws NullPointerException
   instance
}

验证期间的问题更有可能导致异常,所以我的猜测是userRoleaccount 有问题。检查userRole 是否已正确检索,并且帐户save() 调用中没有验证错误:

def account = new Account(email: command.email, password: command.password)
account.save(flush: true)
if (account.hasErrors()) {
   log.warn "Failed to save Account $account: $account.errors"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多