保存 Grails GORM/Domain class 导致“NullPointerException”
Saving a Grails GORM/Domain class results in a `NullPointerException`
我有一项服务负责在成功填写注册页面时创建相关的帐户层次结构:
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
时也失败了。 Account
和 AccountRole
是由 Grails 3 Spring 安全插件 类 生成(并略微调整)。
这是失败的 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
请救我脱离苦海!我现在已经花了几个小时:(
确实没有足够的信息可以确定,但 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
}
更有可能是验证过程中的问题导致了异常,所以我的猜测是 userRole
或 account
有问题。检查 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"
}
我有一项服务负责在成功填写注册页面时创建相关的帐户层次结构:
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
时也失败了。 Account
和 AccountRole
是由 Grails 3 Spring 安全插件 类 生成(并略微调整)。
这是失败的 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
请救我脱离苦海!我现在已经花了几个小时:(
确实没有足够的信息可以确定,但 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
}
更有可能是验证过程中的问题导致了异常,所以我的猜测是 userRole
或 account
有问题。检查 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"
}