2012-12-27 183 views
4

我使用spring deferredresult(servlet 3異步)進行ajax請求處理。但在返回了deferedresult後,我沒有在ajax請求成功方法中獲取響應對象。任何人都有任何想法這可能是什麼原因?我在配置中丟失了什麼?Spring與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的成功方法之後。

在web.xml中,我爲緩衝結果工作所作的唯一更改是爲調度程序servlet和文件管理器映射添加了異步支持。

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

謝謝, Dipti。

+1

哪裏是代碼..? –

+0

其中是客戶端代碼,控制器代碼,web.xml /配置類? –

+0

請參閱編輯的問題。 – Ditpi

回答

1

我得到了問題。實際上,我有一個過濾器後處理對gzip的響應,這是問題的原因。當這個過濾器被刪除時,deachedresult工作。

謝謝,Dipti。

1

DeferredResult旨在由控制器返回,而不是在同一線程中調用setResult()。必須由另一個線程調用setResult()。見Introducing Servlet 3 Async Support(SpringSource團隊博客)。但是,這與國際海事組織沒有任何關係。

如果你想製作JSON with @ResponseBody你必須確保春季發現傑克遜在類路徑:

下方的蓋子,Spring MVC的委託給HttpMessageConverter進行序列化。在這種情況下,Spring MVC調用在Jackson JSON處理器上構建的MappingJacksonHttpMessageConverter。當您使用mvc:註釋驅動的配置元素時,此實現爲自動啓用,並且Jackson類存在於您的類路徑中。

+0

嗨,感謝您的答覆。是的,我知道推遲結果的目的是你的意思,我想只用在我的應用程序中使用它。但有了這個簡單的案例本身不工作,我不能得到那個工作賴特? 也正如你提到的,我已經在xml和jackson中配置了MappingJacksonHttpMessageConverter,在我的類路徑中,並且所有不使用deferredresult的ajax請求也適用於我。我只有在使用deferredresult時纔有問題。 – Ditpi

+0

嗨,有什麼幫助嗎?我坐在這之後超過兩天:( – Ditpi

+0

如果你有一個很好的教程或文檔,請在spring 3.2 deferredresult上分享。 – Ditpi

0

比賽遲到了,但只是爲了防止任何人遇到像我這樣的問題...我們遇到了同樣的問題,響應主體正在消失,也是由於GZip過濾器。刪除這個工作,但簡單地刪除它不是我們的跑步者。爲響應創建GZIPOutputSteam時,構造器將採用syncflush參數。將此布爾值設置爲true可讓您保留過濾器並獲取填充的響應主體。