Spring deferredresult with ajax request

时间:2012-12-27 07:19:23

标签: spring-mvc servlet-3.0

我正在使用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中,我为deffer result工作所做的唯一更改是为调度程序servlet和filer映射添加了异步支持。

我使用的是Spring 3.2.0.RELEASE版本和Tomcat 7.0.34。

谢谢, Dipti。

3 个答案:

答案 0 :(得分:1)

DeferredResult意味着由Controller 返回,而在同一个线程中调用setResult()setResult()必须由另一个线程调用。请参阅Introducing Servlet 3 Async Support(SpringSource团队博客)。但这让IMO与你的空信息毫无关系。

如果你想要产生JSON with @ResponseBody,你必须确保春天在类路径中找到杰克逊:

  

在封面下,Spring MVC委托HttpMessageConverter执行序列化。在这种情况下,Spring MVC调用基于Jackson JSON处理器构建的MappingJacksonHttpMessageConverter。当您使用mvc:annotation-driven配置元素并且类路径中存在Jackson 时,此实现会自动启用

答案 1 :(得分:1)

我遇到了这个问题。实际上我有一个过滤器,后者处理对gzip的响应,这就是问题的原因。当这个过滤器被移除后,defferedresult工作。

谢谢,Dipti。

答案 2 :(得分:0)

比赛迟到,但万一有人遇到这个问题,就像我做的那样......我们有同样的问题,响应机构正在消失,这也是由于GZip过滤器。删除它有效,但只是删除它不是我们的跑步者。在为响应创建GZIPOutputSteam时,构造函数将采用syncflush参数。将此布尔值设置为true可以保留过滤器并获取填充的响应正文。