복붙노트

[SPRING] Spring 부트로 MultipartException을 처리하고 오류 페이지를 표시한다.

SPRING

Spring 부트로 MultipartException을 처리하고 오류 페이지를 표시한다.

스프링 부트로 설정 한 파일이 아주 간단합니다. 최대 파일 크기를 초과하면 오류 페이지를 표시하는 쉬운 방법이 있는지 궁금합니다.

나는 github에서 달성하려고하는 것에 대한 아주 간단한 예를 업로드했습니다.

기본적으로,이 아이디어는 전역 Spring 예외 핸들러에서 MultipartException을 잡는 것이다.

@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로 예외를 처리하는 방법을 알고 계십니까?

@ rossen-stoyanchev에 감사드립니다. 내가 끝내었던 것은 다음과 같다 :

@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. ==============================

    1.핸들러가 선택되기 전에 멀티 파트 요청 구문 분석이 수행되므로 @Controller가 없으므로 아직 말할 수있는 @ControllerAdvice가 없습니다. ErrorController (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-error-handling 참조)를 사용할 수 있습니다. 그.

    핸들러가 선택되기 전에 멀티 파트 요청 구문 분석이 수행되므로 @Controller가 없으므로 아직 말할 수있는 @ControllerAdvice가 없습니다. ErrorController (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-error-handling 참조)를 사용할 수 있습니다. 그.

    BTW에서는 @RequestParam이 필요하지 않습니다. 인수 유형이 MultipartFile이면 충분합니다.

  2. from https://stackoverflow.com/questions/29363705/handling-multipartexception-with-spring-boot-and-display-error-page by cc-by-sa and MIT license