我在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失败时才会正常工作。
答案 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;
仅放在所有者/主要类中,这些联接将由插件处理并保存。