Я использую Grails 2.5.6. У меня в контроллере создается Обещание, которое после завершения время от времени выдает ошибки, и я не могу понять, почему. Вот минимальная реализация:
// 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
Я, очевидно, что-то делаю не так, но я не вижу, что. Я долго бился об это, пожалуйста, помогите?