我在控制器中有一个应该返回JSON的方法。
根据我对grails async docs的解释,在子主题Async Response Rendering下,我可以用任务构造包装我的I / O调用
task{}
那应该进行异步响应呈现。
所以我的方法看起来像
def getSomeJSON() {
task {
def someList = someService.getList()
render([key: someList] as JSON)
}
}
该方法运行正常,但我看到我的日志有很多错误,说
ERROR o.g.a.f.gpars.LoggingPoolFactory - Async execution error: null
java.lang.NullPointerException: null
我不确定是什么原因造成的。我无法在本地计算机上重现这一点。
所以我的问题是上面的代码片段出了什么问题? 我对该文档的解释是错误的吗?
这与“Servlet 3.0 Asynchronous Rendering”
有什么不同编辑:
我按如下方式更新了我的方法:
import static grails.async.Promises.*
def getSomeJSON() {
Promise jsonPromise = task {
def someList = someService.getList()
render([key: someList] as JSON)
}
jsonPromise
}
因此,我在这里所做的更改是显式地从文档中建议的控制器方法返回Promise。引用文档:
这是通过从控制器返回Promise实例来完成的 动作。
但我仍然得到错误:
ERROR o.g.a.f.gpars.LoggingPoolFactory - Async execution error: null
java.lang.NullPointerException: null
at org.apache.catalina.connector.Request.notifyAttributeAssigned(Request.java:1547) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
at org.apache.catalina.connector.Request.setAttribute(Request.java:1538) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
at org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:541) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:279) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:239) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:239) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:239) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
at org.codehaus.groovy.grails.web.util.WebUtils.storeGrailsWebRequest(WebUtils.java:431) ~[grails-web-common-2.4.2.jar:2.4.2]
at org.codehaus.groovy.grails.plugins.web.async.WebRequestPromsiseDecorator$_decorate_closure1.doCall(WebRequestPromiseDecoratorLookupStrategy.groovy:55) ~[grails-plugin-async-2.4.2.jar:2.4.2]
at org.codehaus.groovy.grails.plugins.web.async.WebRequestPromsiseDecorator$_decorate_closure1.call(WebRequestPromiseDecoratorLookupStrategy.groovy) ~[grails-plugin-async-2.4.2.jar:2.4.2]
at org.grails.async.factory.gpars.GparsPromise$_onError_closure2.doCall(GparsPromise.groovy:72) ~[grails-async-2.4.2.jar:2.4.2]
at org.grails.async.factory.gpars.GparsPromise$_onError_closure2.call(GparsPromise.groovy) ~[grails-async-2.4.2.jar:2.4.2]
at groovyx.gpars.dataflow.DataCallback$1.run(DataCallback.java:62) ~[gpars-1.2.1.jar:1.2.1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_71]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_71]
at java.lang.Thread.run(Thread.java:745) ~[na:1.7.0_71]