带有ajax请求的Spring deferredresult

Posted

技术标签:

【中文标题】带有ajax请求的Spring deferredresult【英文标题】:Spring deferredresult with ajax request 【发布时间】:2012-12-12 14:56:57 【问题描述】:

我正在使用 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。

谢谢, 迪普蒂。

【问题讨论】:

客户端代码、控制器代码、web.xml/配置类在哪里? 请查看已编辑的问题。 请查看在 Spring 上创建的 bug(已解决为无效)!他们面临着与您完全相同的问题!唯一的方法是在 Controller 服务方法之外设置 deferredResult。 【参考方案1】:

DeferredResult 旨在由控制器返回而不在同一线程中调用setResult()setResult() 必须由另一个线程调用。请参阅Introducing Servlet 3 Async Support(SpringSource 团队博客)。但这与 IMO 无关,与您的空消息无关。

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

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

【讨论】:

嗨,谢谢你的回复。是的,我知道延迟结果的目的是你的意思,我想只在我的应用程序中使用它。但是这个简单的案例本身不起作用我不能得到这太工作赖特?此外,正如你所提到的,我已经在 xml 中配置了 MappingJacksonHttpMessageConverter,杰克逊在我的类路径中,所有不使用 deferredresult 的 ajax 请求也适用于我。我只有在使用 deferredresult 时才有问题。 嗨,有什么帮助吗?我在这后面坐了两天多:( 如果有人在 spring 3.2 deferredresult 上有很好的教程或文档,请分享。【参考方案2】:

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

谢谢,迪普蒂。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于带有ajax请求的Spring deferredresult的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS和Spring MVC的Ajax GET错误

带有 '&' 的参数会破坏 $.ajax 请求

带有百分比的 JQuery Ajax 请求

使用带有 ajax Rest 调用的 Spring CSRF 和带有 Thymeleaf 的 HTML 页面

带有ajax请求的Django

带有模型和百里香叶的 Spring Boot Ajax 发布表单提交