Обработка MultipartException с помощью Spring Boot и отображения страницы с ошибкой

У меня очень простая загрузка файлов с помощью Spring Boot. Мне было интересно, если бы был простой способ отобразить страницу с ошибкой при превышении максимального размера файла.

Я загрузил очень простой пример того, что я пытаюсь достичьна GitHub.

По сути, идея заключается в том, чтобы перехватить MultipartException в глобальном обработчике исключений Spring:

@ControllerAdvice
public class UploadExceptionHandler {

  @ExceptionHandler(MultipartException.class)
  public ModelAndView handleError(MultipartException exception) {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("error", exception.getMessage());
    modelAndView.setViewName("uploadPage");
    return modelAndView;
  }
}

Контроллер, который обрабатывает загрузку файлов, действительно прост:

@RequestMapping("/")
public String uploadPage() {
    return "uploadPage";
}

@RequestMapping(value = "/", method = RequestMethod.POST)
public String onUpload(@RequestParam MultipartFile file) {
    System.out.println(file.getOriginalFilename());
    return "uploadPage";
}

И шаблон uploadPage.html thymeleaf, связанный с ним тоже:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head lang="en">
    <title>Upload</title>
</head>
<body>

<div style="color: red" th:text="${error}" th:if="${error}">
    Error during upload
</div>

<form th:action="@{/}" method="post" enctype="multipart/form-data">
  <input type="file" id="file" name="file"/>
  <button type="submit" name="save">Submit</button>
</form>
</body>
</html>

Идея состоит в том, чтобы отобразить сообщение об ошибке на той же странице загрузки, когда файл слишком большой.

Насколько я понимаю, можно было бы сконфигурировать Spring MultipartResolver для ленивого разрешения исключений и иметь возможность перехватывать эти исключения на уровне Spring (обработчики исключений MVC), но этот код, похоже, не помогает:

@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
public StandardServletMultipartResolver multipartResolver() {
    StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
    multipartResolver.setResolveLazily(true);
    return multipartResolver;
}

Поэтому, прежде чем я прибегну к крайним мерам, таким как фильтр или расширение MultipartResolver ...

Знаете ли вы чистый способ обработки этих исключений с помощью Spring MVC?

Ответ

Благодаря @ Россен-Стоянчев. Вот что я в итоге сделал:

@RequestMapping("uploadError")
public ModelAndView onUploadError(HttpServletRequest request) {
    ModelAndView modelAndView = new ModelAndView("uploadPage");
    modelAndView.addObject("error", request.getAttribute(WebUtils.ERROR_MESSAGE_ATTRIBUTE));
    return modelAndView;
}

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return container -> container.addErrorPages(new ErrorPage(MultipartException.class, "/uploadError"));
}

Работает как шарм и чувствует себя как элегантное решение. Я обновил проект на github, если кому-то интересно. Большое спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос