Java 如何下载SpringREST文件以返回404?
我有一个简单的RESTAPI,具有文件下载功能。端点的定义如下所示: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
@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时。