Весна: Как вернуть кастом 404 вместо Ресурса - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть конечная точка отдыха для доставки файла из файловой системы пользователю через 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";
    }

}

1 Ответ

0 голосов
/ 25 апреля 2019

Я не нашел этого вчера (искал и пробовал вещи весь день), но вот быстрое и простое решение с весны 5, просто:

throw new ResponseStatusException(HttpStatus.NOT_FOUND);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...