2013-02-06 46 views
1

我正在使用新的spring 3.2異步servlet請求。 一切運作良好,除了在這一個場景......Spring DeferredResult setResult導致404

@RequestMapping("/test") 
@ResponseBody 
public DeferredResult<byte[]> test(InputStream is, HttpServletResponse response, WebRequest request) { 
    if (someTest()) { 
     deferredResult.setResult(DATA); 
     return deferredResult; 
    } 

    deferredResult.onTimeout(new Runnable() { 

     @Override 
     public void run() { 
      deferredResult.setResult(DATA); 
     } 
    }); 

    // Use deferredResult in another thread when needed 

    return deferredResult; 
} 

someTest()是真實的春天/ tomcat的返回一個404。我不知道我應該如何去了解這個或爲什麼出現這種情況?我認爲這可能是因爲Servlet異步上下文已經創建。這是一個錯誤還是我做錯了什麼?

任何信息將不勝感激!

+0

請看到這個[錯誤](https://jira.springsource.org/browse/SPR-10410)(這是解析爲無效) ! 他們面臨着與你面臨完全相同的問題! 唯一的方法是在Controller服務方法之外設置deferredResult。 – brainOverflow

回答

0

我想通了,見下文......

@RequestMapping("/test") 
@ResponseBody 
public DeferredResult<byte[]> test(InputStream is, HttpServletResponse response, WebRequest request) { 
    if (someTest()) { 
    response.getOutputStream().write(DATA); 
    return null; 
} 

deferredResult.onTimeout(new Runnable() { 

    @Override 
    public void run() { 
     deferredResult.setResult(DATA); 
    } 
}); 

// Use deferredResult in another thread when needed 

return deferredResult; 

}

關鍵是要返回null手動讀寫響應的ServletResponse。

希望這會涉及在使用上春創建別人:)

0

我認爲你需要從if條件中刪除語句return deferredResult

而且setData應該在return語句之後完成。所以你需要從一些服務器端事件的單獨線程來完成。

希望這可以幫助你。

+0

沒有真正的幫助,因爲一些條件應該立即返回結果,其他人應該「停放」另一個線程使用。 – Paul