我有一个简单的REST API,具有文件下载功能。端点定义如下:
@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 :(得分:1)
你可能想做这样的事情:
response.setStatus(HttpStatus.NOT_FOUND.value());
当然,您需要将HttpServletResponse添加到方法声明中。