GRAILS addTo中的奇怪空指针错误

时间:2014-05-19 11:29:42

标签: grails null gorm

我在GRAILS应用程序中遇到了一个奇怪的错误。

我有以下两个域类

class IncidentLog {
String log
Date dateCreated
User createdBy
static belongsTo = [incident: Incident]
static constraints = {

    createdBy nullable:true
    log nullable:true
}

}

class Incident{
static hasMany=[logs:IncidentLog]
}

在我的一项服务中,我有以下方法来保存新的日志条目

def addLog(request){

    Incident incident=Incident.get(request.JSON.id)
    User currentuser=User.get(springSecurityService.principal.id)

    IncidentLog logEntry=new IncidentLog(

        log:request.JSON.log,
        createdBy:currentuser

    )


    logEntry.createdBy=currentuser

    incident.addToLogs(logEntry)
    incident.save(failOnError:true)

}

由于某种原因,这会引发以下stacktrace

的空指针异常
2014-05-19 12:13:13,351 [http-bio-8090-exec-6] ERROR errors.GrailsExceptionResolver  -        NullPointerException occurred when processing request: [POST] /MASH/incident/ajaxAddLog
Stacktrace follows:
Message: null
Line | Method
->> 1051 | <init>           in java.util.Collections$UnmodifiableCollection
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1204 | <init>           in java.util.Collections$UnmodifiableList
|   1190 | unmodifiableList in java.util.Collections
|    223 | ajaxAddLog       in com.saadian.mash.IncidentController
|    200 | doFilter . . . . in grails.plugin.cache.web.filter.PageFragmentCachingFilter
|     63 | doFilter         in grails.plugin.cache.web.filter.AbstractFilter
|     53 | doFilter . . . . in    grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
|     49 | doFilter         in  grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter
|     82 | doFilter . . . . in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|     49 | doFilterInternal in grails.plugin.springsecurity.shiro.ShiroSubjectBindingFilter
|   1145 | runWorker . . .  in java.util.concurrent.ThreadPoolExecutor
|    615 | run              in java.util.concurrent.ThreadPoolExecutor$Worker
^    724 | run . . . . . .  in java.lang.Thread

我已经使用GRAILS多年了,并且在任何帮助之前从未见过这个错误,建议将不胜感激。

由于

我第一次创建事件时的一些进一步信息我还创建了一个IncidentLog实例并将其添加到日志集中,并且只有在后续尝试调用addTo失败时才会正常工作。

2 个答案:

答案 0 :(得分:0)

在域类中初始化`logs'集合:

class Incident{
  List logs = []
  static hasMany=[logs:IncidentLog]
}

答案 1 :(得分:0)

您必须检查您正在使用的插件。特别是当你看到错误在一行中没有像something.save()这样的空对象时(你确定something不是null并且是域类的对象)。

如果您像我一样使用org.grails.plugins:audit-logging,则必须将static auditable = true;仅放在所有者/主要类中,这些联接将由插件处理并保存。