java - 如何获取 Spring REST 文件下载以返回 404?

标签 java spring rest spring-mvc filesystems

我有一个简单的 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?

编辑 - 下面的堆栈跟踪了解其值(value):

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)

最佳答案

你可能想做这样的事情:

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

当然,您需要将 HttpServletResponse 添加到方法声明中。

关于java - 如何获取 Spring REST 文件下载以返回 404?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19591257/

相关文章:

spring - 如何在 Spring RestTemplate 请求上设置 "Accept:" header ?

java - log4j级别配置TRACE和ALL

java - Eclipse Neon 和 Oxygen setExtended GridLayout 无法转换为 FillLayout

java - 如何更改redirect.jsp以查看我的自定义jsp页面而不是index.jsp

java - 模拟 flickr api 以实现更好的单元测试

javascript - 如何将 JSON 数据传递到 Express REST API

java - 将元素添加到 ArrayList 时引发异常

Java 蜂鸣声 : Produce sound of some specific frequencies

java - Activiti 用户界面 Spring App 集成

java - 在elasticsearch查询中配置搜索词的标记化