我有一个休息端点,可以通过FileSystemResource
将文件从文件系统传送到用户。如果找不到该文件,它将显示我的自定义404错误页面。但是我该如何实现呢?如果我只返回状态为404的ResponseEntity,则会显示默认错误页面,而不是我的。我还有其他MVC控制器,如果输入无效的URL,则会返回我的自定义错误页面。我试图返回一个ModelAndView
对象和其他东西,但是似乎没有任何作用。
这里是下载端点的示例(仅是重要部分):
@GetMapping("/download/{fileName}")
public ResponseEntity<FileSystemResource> downloadFile(@PathVariable("fileName") String fileName) {
FileSystemResource fileResource= new FileSystemResource(STORAGE_LOCATION + fileName);
if (fileResource.exists()) {
HttpHeaders headers = new HttpHeaders();
headers.setContentDisposition(ContentDisposition.parse("attachment; filename=" + fileName));
headers.setContentLength(fileResource.contentLength());
return new ResponseEntity<>(fileResource, headers, HttpStatus.OK);
} else {
//what to return here
}
}
MVC部分由自定义错误控制器覆盖,该错误控制器取自我发现的一些示例:
@Controller
public class CustomErrorController implements ErrorController {
@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
if (status != null) {
Integer statusCode = Integer.valueOf(status.toString());
if (statusCode == HttpStatus.FORBIDDEN.value()) {
return "error/403";
} else if (statusCode == HttpStatus.NOT_FOUND.value()) {
return "error/404";
} else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
return "error/500";
}
}
return "error/default";
}
@Override
public String getErrorPath() {
return "/error";
}
}
答案 0 :(得分:0)
我昨天没有找到这个(整个下午都在搜索和尝试过),但这是自5月5日以来的快速简便的解决方案,只是:
throw new ResponseStatusException(HttpStatus.NOT_FOUND);