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)
需要注意的是,捕獲'Throwable'或命名一個異常'錯誤'是個壞主意。錯誤是主要的虛擬機或硬件錯誤,你不能在你的代碼中適當地處理它們;調用你自己的異常類錯誤是要求混淆。 – chrylis
是你自己的錯誤類嗎?還是JDK的? –
該錯誤類不是一個例外。這是我自己的帶有XML/JSON註釋的小模型對象。根據我的經驗,在Web服務中不要捕獲Throwable是一個非常糟糕的主意,因爲我需要在所有情況下控制響應。 – Steve