Manipulando MultipartException com Spring Boot e exibir a página de erro
Eu tenho um upload de arquivo muito simples configurado com o Spring Boot. Eu queria saber se havia uma maneira fácil de exibir uma página de erro quando o tamanho máximo do arquivo for excedido.
Eu enviei um exemplo muito simples do que estou tentando alcançarno github.
Basicamente, a idéia é capturar a MultipartException em um manipulador global de exceções do 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;
}
}
O controlador que lida com o upload do arquivo é realmente simples:
@RequestMapping("/")
public String uploadPage() {
return "uploadPage";
}
@RequestMapping(value = "/", method = RequestMethod.POST)
public String onUpload(@RequestParam MultipartFile file) {
System.out.println(file.getOriginalFilename());
return "uploadPage";
}
E o modelo uploadPage.html thymeleaf associado a ele também:
<!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>
A ideia é exibir uma mensagem de erro na mesma página de upload quando o arquivo for muito grande.
Entendi que alguém configuraria o MultipartResolver do Spring para resolver exceções preguiçosamente e conseguir capturar essas exceções no nível do Spring (manipuladores de exceção do MVC), mas esse código não parece ajudar:
@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
public StandardServletMultipartResolver multipartResolver() {
StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
multipartResolver.setResolveLazily(true);
return multipartResolver;
}
Portanto, antes de recorrer a medidas extremas como um filtro ou estender o MultipartResolver ...
Você conhece uma maneira limpa de lidar com essas exceções com o Spring MVC?
RespondaGraças a @ rossen-stoyanchev. Aqui está o que eu acabei fazendo:
@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"));
}
Funciona como um encanto e parece uma solução elegante. Atualizei o projeto no github se alguém estiver interessado. Muito Obrigado!