gpt4 book ai didi

java - Spring Boot 处理 SizeLimitExceededException

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:10 25 4
gpt4 key购买 nike

我使用的是 Spring boot 1.5.7。
我没有配置 CommonsMultipartResolver,因为 Spring Boot 已经处理文件上传了。

如果我的上传超过最大允许大小,则会抛出一个难看的异常。
这是由我的 Controller 处理的。

@ControllerAdvice
public abstract class DefaultController implements InitializingBean {
@ExceptionHandler(Exception.class)
public ResponseEntity<ServiceException> handleException(final Exception ex) {
...
} else if (ex instanceof MultipartException) {
MultipartException me = (MultipartException) ex;
Throwable cause = ex.getCause();
if (cause instanceof IllegalStateException) {
Throwable cause2 = cause.getCause();
if (cause2 instanceof SizeLimitExceededException) {
// this is tomcat specific
SizeLimitExceededException slee = (SizeLimitExceededException) cause2;
}
}
}

这种处理不仅复杂,而且遗憾的是 Tomcat 特定的,因为 SizeLimitExceededException 在包 org.apache.tomcat.util.http.fileupload.FileUploadBase 中。

无论使用哪个 Servlet 引擎,我如何处理错误情况,即有人上传了一个更大的文件然后允许并返回一条好消息?

最佳答案

您可以在您的 @ControllerAdvice 中定义一个异常处理程序方法,它专门用于 MultipartException,然后使用特定的 HttpStatus 对其进行限定。例如:

@ExceptionHandler(MultipartException.class)
@ResponseStatus(value = HttpStatus.PAYLOAD_TOO_LARGE)
public ResponseEntity<ServiceException> handleMultipartException(MultipartException ex) {
...
}

这应该可以让您专注于“最大文件大小”异常,而不必深入研究 servlet 容器的细节。

更新 1 以回应此评论:

Sounds good, what about getPermittedSize and getActualSize provided by SizeLimitExceededException is there a chance to get this values not only if Tomcat is used?

通过在 (a) 异常类型和 (b) HTTP 状态的基础上拦截此错误...您使解决方案普遍适用。但是在这样做的过程中,您可能会丢失一个 servlet 容器(但也许不是另一个)可能给您的那种详细信息。您也许可以通过设置 spring.http.multipart.max-file-size 来强制执行您自己的最大大小,在这种情况下您可以报告“允许的大小”,但如果您想报告“实际大小” ' 那么您将不得不考虑以下情况之一:

  • 必须使用servlet容器提供的东西
  • 选择小于您的 servlet 容器支持的最大值的 spring.http.multipart.max-file-size,然后在您的 Controller 中应用您自己的最大大小检查并抛出您自己的特定包含实际和允许大小的异常类型。

关于java - Spring Boot 处理 SizeLimitExceededException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46708665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com