У меня есть конечная точка отдыха для доставки файла из файловой системы пользователю через FileSystemResource
. Если файл не найден, он должен отобразить мою страницу ошибки 404. Но как мне этого добиться? Если я просто возвращаю ResponseEntity со статусом 404, отображается страница ошибки по умолчанию, а не моя. У меня есть другие контроллеры 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";
}
}