grails - 使用 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
我显然做错了什么,但我不明白是什么。很长时间以来,我一直在努力解决这个问题-请帮忙?
解决方案
推荐阅读
- oracle - 使用 Sqplus 10 天没有数据,如何获取 90 天的数据?
- c# - 有什么方法可以在另一个测试中运行一个测试,并能够查看子测试是否通过?
- python - 使用特定的 conda env 运行 pipenv?
- r - 在 R 中使用 read_excel 手动分配列名
- python - 如何从文件中分割某些数字以将它们作为值放入字典中的列表中?
- reactjs - 反应验证表单,但提交时没有刷新
- amazon-dynamodb - AWS Scan 忽略 withLimit()
- pandas - 遍历 df.index 的唯一元素以找到列中的最小值
- node.js - Mongoose.countDocuments 在按去年创建的时刻 js 计算文档时不起作用
- c# - 如何将 CDPSession 与 puppeteersharp 拦截请求一起使用