2016-05-15 2 views
1

У меня есть служба, которая отвечает за создание соответствующей иерархии учетной записи при регистрации страницы успешно заполняли:Сохранение результатов класса Grails GORM/домена в `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 Security.

Вот StackTrace для 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 

Пожалуйста спасти меня от страданий! Я потратил несколько часов на это сейчас :(

+0

Можете ли вы предоставить пример приложения с таким поведением? Я могу только вещь вашего класса домена не в правильном каталоге, поэтому на самом деле это не класс домена. –

+0

Часть издателя этого примера кажется несущественной ... может потребоваться принять это. Я также никогда не использовал «final» для локальных объявлений переменных, особенно тех, которые будут меняться (как и при «сохранении»). – billjamesdev

ответ

2

На самом деле информации недостаточно, но маловероятно, что instance имеет значение null, так как вы только что создали его с вызовом конструктора, но вы должны убедиться в этом, например,

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" 
} 
Смежные вопросы