Java 如何下载SpringREST文件以返回404?

Java 如何下载SpringREST文件以返回404?,java,spring,rest,spring-mvc,filesystems,Java,Spring,Rest,Spring Mvc,Filesystems,我有一个简单的RESTAPI,具有文件下载功能。端点的定义如下所示: @RequestMapping(value = "/myapi/files/{fileName}", method = RequestMethod.GET, produces = { MediaType.APPLICATION_OCTET_STREAM_VALUE }) @ResponseBody FileSystemResource downloadFile(String fileName) t

我有一个简单的RESTAPI,具有文件下载功能。端点的定义如下所示:

@RequestMapping(value = "/myapi/files/{fileName}", 
    method = RequestMethod.GET, 
    produces = { MediaType.APPLICATION_OCTET_STREAM_VALUE })
@ResponseBody FileSystemResource downloadFile(String fileName) 
    throws UnknownFileException;
response.setStatus(HttpStatus.NOT_FOUND.value());
实施方法的主要内容是:

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截获了,而Spring ResourceHttpMessageConverter正在向客户端抛出一个500错误

所以我的问题是如何确保返回HTTP404而不是泛型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)

您可能希望执行以下操作:

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

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

您可能需要执行以下操作:

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

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

注意,捕获可丢弃的
或命名异常
错误
都不是一个好主意<代码>错误< /代码> S是主要的VM或硬件错误,并且不能在代码的中间适当处理它们;调用您自己的异常类
Error
会引起混淆。
Error
类是您自己的吗?或者JDK?这个错误类不是例外。这是我自己的带有XML/JSON注释的小模型对象。根据我的经验,在web服务中不捕获Throwable是一个非常糟糕的主意,因为我需要在所有情况下控制响应。@Steve您是否在类的顶部导入了它?我有-在同一个类中有许多其他方法,其中一些方法成功地抛出该异常以生成404。唯一的问题是当返回对象是FileSystemResource时。请注意,捕获
Throwable
或命名异常
Error
都不是一个好主意<代码>错误< /代码> S是主要的VM或硬件错误,并且不能在代码的中间适当处理它们;调用您自己的异常类
Error
会引起混淆。
Error
类是您自己的吗?或者JDK?这个错误类不是例外。这是我自己的带有XML/JSON注释的小模型对象。根据我的经验,在web服务中不捕获Throwable是一个非常糟糕的主意,因为我需要在所有情况下控制响应。@Steve您是否在类的顶部导入了它?我有-在同一个类中有许多其他方法,其中一些方法成功地抛出该异常以生成404。唯一的问题是当返回对象是FileSystemResource时。