春季:如何返回自定义404而不是资源

时间:2019-04-25 07:01:00

标签: spring-mvc

我有一个休息端点,可以通过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";
    }

}

1 个答案:

答案 0 :(得分:0)

我昨天没有找到这个(整个下午都在搜索和尝试过),但这是自5月5日以来的快速简便的解决方案,只是:

throw new ResponseStatusException(HttpStatus.NOT_FOUND);