Spring Boot中如何处理最大文件大小异常?

问题描述 投票:0回答:1

我正在使用 Spring Boot v1.2.5 创建 REST 应用程序。上传图像时,我会检查最大文件大小,这是提供的属性:

multipart.maxFileSize= 128KB

在应用程序属性中。该功能由 Spring Boot 本身提供。现在检查工作正常。问题是,如何处理异常并向用户返回他能理解的消息?

更新1----------

我在控制器中编写了一个方法,我打算使用

@ExceptionHandler
来处理 MultipartException。好像没啥作用。

这是我的代码:

@ExceptionHandler(MultipartException.class)
@ResponseStatus(value = HttpStatus.PAYLOAD_TOO_LARGE)
public ApplicationErrorDto handleMultipartException(MultipartException exception){
    ApplicationErrorDto applicationErrorDto =  new ApplicationErrorDto();
    applicationErrorDto.setMessage("File size exceeded");
    LOGGER.error("File size exceeded",exception);
    return applicationErrorDto;
}

更新2----------

在@luboskrnac指出之后,我设法想出了一个解决方案。我们可以在这里使用

ResponseEntityExceptionHandler
来处理这种特殊情况。我相信,我们也可以使用
DefaultHandlerExceptionResolver
,但是
ResponseEntityExceptionHandler
将允许我们返回
ResponseEntity
,而不是前者,后者的方法将返回
ModelAndView
。不过我还没有尝试过。

这是我用来处理

MultipartException
的最终代码:

@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

private static final Logger LOGGER = Logger.getLogger(CustomResponseEntityExceptionHandler.class);

@ExceptionHandler(MultipartException.class)
@ResponseStatus(value = HttpStatus.PAYLOAD_TOO_LARGE)
@ResponseBody
public ApplicationErrorDto handleMultipartException(MultipartException exception){
    ApplicationErrorDto applicationErrorDto =  new ApplicationErrorDto();
    applicationErrorDto.setMessage("File size exceeded");
    LOGGER.error("File size exceeded",exception);
    return applicationErrorDto;
}
}

我正在使用 Swagger 来开发/记录 REST API。这是上传超出大小的文件时的响应。 enter image description here 谢谢。

java spring spring-mvc spring-boot spring-restcontroller
1个回答
5
投票

Spring Boot 文档说

您还可以使用常规 Spring MVC 功能,例如

@ExceptionHandler
方法和
@ControllerAdvice
。然后
ErrorController
将拾取 任何未处理的异常。

由于

MultipartException
似乎在
@Controller/@ExceptionHandler/@ControllerAdvice
功能发挥作用之前发生,因此您应该使用
ErrorController
来处理它。

顺便说一句,我同时发现了这个线程。你可能想看一下。

© www.soinside.com 2019 - 2024. All rights reserved.