首页 > 解决方案 > 使用 Grails Promises 时生成 NullPointerException

问题描述

我正在使用 Grails 2.5.6。我在控制器中创建了一个 Promise,完成后偶尔会出错,我不知道为什么。这是一个最小的实现:

// FooController.groovy
def bar()
{
  Promises.task {
    log.debug "Hello, Test!"
  }.onComplete {
    log.debug "Complete!"
  }.onError {
    log.debug "Error!"
  }
  render "OK"
}

我第一次在浏览器中打开“foo/bar”时,按预期看到“OK”,并且日志显示

2018-05-01 16:00:17,311 [Actor Thread 1] DEBUG - Hello, Test!
2018-05-01 16:00:17,322 [Actor Thread 2] DEBUG - Complete!

正如预期的那样。但是,下次我加载它时会出现异常:

2018-05-01 16:00:21,890 [Actor Thread 4] DEBUG - Hello, Test!
Error |
2018-05-01 16:00:21,896 [Actor Thread 6] ERROR gpars.LoggingPoolFactory  - Async execution error: null
Message: null
    Line | Method
->> 1513 | notifyAttributeAssigned in org.apache.catalina.connector.Request
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1503 | setAttribute            in     ''
|    539 | setAttribute . . . . .  in org.apache.catalina.connector.RequestFacade
|    283 | setAttribute            in org.apache.catalina.core.ApplicationHttpRequest
|    431 | storeGrailsWebRequest . in org.codehaus.groovy.grails.web.util.WebUtils
|     55 | doCall                  in org.codehaus.groovy.grails.plugins.web.async.WebRequestPromsiseDecorator$_decorate_closure1
|     -1 | call . . . . . . . . .  in     ''
|     61 | doCall                  in org.grails.async.factory.gpars.GparsPromise$_onComplete_closure1
|     -1 | call . . . . . . . . .  in     ''
|     62 | run                     in groovyx.gpars.dataflow.DataCallback$1
|   1142 | runWorker . . . . . . . in java.util.concurrent.ThreadPoolExecutor
|    617 | run                     in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run . . . . . . . . . . in java.lang.Thread

请注意,在第二次运行时,onError不会调用闭包。我将异常追溯到以下行,org.apache.catalina.connector.Request但据我所知:

private void notifyAttributeAssigned(String name, Object value, Object oldValue) {
  Context context = this.getContext();
  Object[] listeners = context.getApplicationEventListeners();
                              ^-- NullPointerException thrown here

我显然做错了什么,但我不明白是什么。很长时间以来,我一直在努力解决这个问题-请帮忙?

标签: grailsgroovypromise

解决方案


推荐阅读