2013-10-25 45 views
1

我有一個簡單的REST API,具有文件下載功能。端點的定義是這樣的:如何獲取Spring REST文件下載以返回404?

@RequestMapping(value = "/myapi/files/{fileName}", 
    method = RequestMethod.GET, 
    produces = { MediaType.APPLICATION_OCTET_STREAM_VALUE }) 
@ResponseBody FileSystemResource downloadFile(String fileName) 
    throws UnknownFileException; 

的實現方法的肉是目前:

try { 
    FileSystemResource fsr = 
     new FileSystemResource("C:/myfiles/" + fileName + "." + suffix); 
} catch (Throwable e) { 
    throw new UnknownFileException(); 
} 

而且我有一個簡單的異常處理程序,它返回一個404

@ExceptionHandler(UnknownFileException.class) 
@ResponseBody 
@ResponseStatus(HttpStatus.NOT_FOUND) 
public ErrorMessage handleUnknownFileException(
     UnknownFileException e, HttpServletRequest req) { 
    return new ErrorMessage(e); 
} 

這些異常處理程序很好地適用於返回XML/JSON響應的其他操作。我遇到的麻煩是,當這個方法拋出一個異常時,它看起來像被Spring ResourceHttpMessageConverter攔截了,它將一個500錯誤返回給客戶端。

所以我的問題是我如何確保HTTP 404返回而不是通用500?

編輯 - 低於它的價值堆棧跟蹤:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.....UnknownFileException: Unable to find file 
     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894) 
     org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) 
     javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
     javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
     org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
     org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:88) 
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
+0

需要注意的是,捕獲'Throwable'或命名一個異常'錯誤'是個壞主意。錯誤是主要的虛擬機或硬件錯誤,你不能在你的代碼中適當地處理它們;調用你自己的異常類錯誤是要求混淆。 – chrylis

+0

是你自己的錯誤類嗎?還是JDK的? –

+0

該錯誤類不是一個例外。這是我自己的帶有XML/JSON註釋的小模型對象。根據我的經驗,在Web服務中不要捕獲Throwable是一個非常糟糕的主意,因爲我需要在所有情況下控制響應。 – Steve

回答

1

你可能想要做這樣的事情:

response.setStatus(HttpStatus.NOT_FOUND.value()); 

當然,你需要HttpServletResponse的添加到方法宣言。