4

我正在使用spring deferredresult(servlet 3 async)进行ajax请求处理。但是在返回deferedresult之后,我没有在ajax请求成功方法中得到响应对象。有人知道这可能是什么原因吗?我在配置中遗漏了什么吗?

以下是ajax调用代码:

function sendajaxreq() {
    $
            .ajax({
                url : "plantView/testLink",
                type : "GET",
                data : "",
                cache : false,
                success : function(messages) {
                    alert(messages);
                },
                error : function(xhr) {
                    if (xhr.statusText != "abort" && xhr.status != 503) {
                        console
                                .error("Unable to retrieve chat messages. Chat ended.");
                    }
                }
            })
}

控制器代码:

@RequestMapping(value = "/testLink", method = RequestMethod.GET)
@ResponseBody
public DeferredResult<Map<String, WebView>> testLink() {

    DeferredResult<Map<String, WebView>> chartsResult = new       DeferredResult<Map<String, WebView>>();

    Map<String, WebView> res = processSampleReq();
    chartsResult.setResult(res);
     chartsResult.onCompletion(new Runnable() {
     @Override
     public void run() {
     System.out.println("deffered res completed");
     }
     });

    return chartsResult;
}

即使在返回chartsResult 之后,我在ajaxcall 成功方法中也将消息设为null。

在 web.xml 中,我为使延迟结果起作用所做的唯一更改是为调度程序 servlet 和文件管理器映射添加了异步支持。

我正在使用 Spring 3.2.0.RELEASE 版本和 Tomcat 7.0.34。

谢谢,迪普蒂。

4

3 回答 3

1

DeferredResult 意味着由控制器返回而不setResult()在同一个线程中调用。setResult()必须由另一个线程调用。请参阅介绍 Servlet 3 异步支持(SpringSource 团队博客)。但这与 IMO 与您的空消息无关。

如果您想使用 @ResponseBody 生成 JSON,您必须确保 spring 在类路径中找到 Jackson:

在幕后,Spring MVC 委托给 HttpMessageConverter 来执行序列化。在这种情况下,Spring MVC 调用一个建立在 Jackson JSON 处理器上的 MappingJacksonHttpMessageConverter。当您使用 mvc:annotation-driven 配置元素时自动启用此实现,而 Jackson 存在于您的 classpath中。

于 2012-12-27T13:17:33.540 回答
1

我得到了这个问题。实际上我有一个过滤器,它对 gzip 的响应进行后处理,这就是问题的原因。当这个过滤器被删除时,deferedresult 起作用了。

谢谢,迪普蒂。

于 2013-07-05T13:08:06.537 回答
0

游戏有点晚了,但以防万一有人像我一样遇到这个问题......我们遇到了同样的问题,即响应正文消失了,这也是由于 GZip 过滤器造成的。删除它有效,但简单地删除它对我们来说不是一个跑步者。在为响应创建 GZIPOutputSteam 时,构造函数将采用 syncflush 参数。将此布尔值设置为 true 允许您保留过滤器并获得填充的响应正文。

于 2015-10-28T10:04:47.617 回答