当前位置: 首页 > 知识库问答 >
问题:

Spring Boot句柄SizeLimitExceededException

柴赞
2023-03-14

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

如果我的上载超过允许的最大大小,则会抛出一个丑陋的异常
这由我的控制器处理。

@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位于包组织中。阿帕奇。公猫util。http。文件上载。FileUploadBase

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

共有2个答案

唐照
2023-03-14

这在我的@RestControlller建议和异常工作细比MultipartException更具体:

@ExceptionHandler(MaxUploadSizeExceededException.class)
@ResponseStatus(value = HttpStatus.PAYLOAD_TOO_LARGE)
public ResponseEntity handleMultipartException(MaxUploadSizeExceededException e) {

    Map<String, String> result = new HashMap<>();
    result.put("message", "Error ==> Large File ");
    return  ResponseEntity.status(HttpStatus.PAYLOAD_TOO_LARGE)
            .body(result);

}

PS:当使用@RestControllerAdvice(annotations=RestController.class)时,它不起作用。。您必须在没有RestController的情况下放置@RestControllerAdvice。类注释

濮阳景天
2023-03-14

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

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

这应该允许您关注“最大文件大小”异常,而无需了解servlet容器的细节。

更新1回应此评论:

听起来不错,那么SizeLimitExceededException提供的getPermittedSize和getActualSize是否有机会不仅在使用Tomcat的情况下获得此值?

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

  • 必须使用servlet容器提供的东西
  • 选择一个spring.http.multipart.max-file-size,它小于servlet容器支持的最大值,然后在控制器中应用您自己的最大值检查,并抛出您自己的特定异常类型,其中包含实际和允许的大小。
 类似资料:
  • 在书写代码与阅读代码的时候,经常会看到这一句代码: typedef void *HANDLE ,它是何方神圣呢?如何理解呢? 不理解它的时候,感觉它很神奇,知道它以后,它就是个typedef的定义,只不过是void*类型罢了,也就是HANDLE等价于void *,我们可以叫它披着句柄皮的指针(PS:指针和句柄是有区别的,在这说句废话); 对于void* 神通广大,因为它作为函数参数or函数返回值,

  • 当你用作图命令时,MATLAB用多种图形对象创建图形,例如线,文本,表面(完整列表见Graphics Objects)。所有图形对象都有控制其性能的属性。你可以在MATLAB中询问每种属性的取值并设置大部分的属性值。 每当MATLAB创建一个图形对象时,它就给该对象赋以一个标识符(称为句柄)。可以用此句柄访问对象属性。若你想作下列操作,句柄图形很有用。 修改图形外观。 通过编写能直接创建和操作对象

  • 问题内容: 我正在尝试自己学习编程,但仍在尝试掌握它。我收到以下错误: java.io.IOException:句柄无效 这是我的代码 我相信,每当我调用该方法时,都会出现错误,当我尝试显示默认构造函数中的字节数时,它可以很好地工作并显示。 问题答案: 好了,在实际开始使用它之前,请先关闭构造函数的块。将结束部分从构造函数中移到完成后将被调用的位置,例如在main 下方调用或单独的close方法。

  • 你可以创建任何MATLAB函数的句柄,然后用这些句柄作为函数链接的途径。函数句柄主要用来传递自变量列表给其他函数,用句柄执行函数或求值。 在MATLAB中,通过在函数名前加上符号@构造函数句柄。下面例子为SIN函数创建一个函数句柄,然后赋值给变量fhandle: fhandle = @sin; 用MATLAB的fevel函数对函数句柄求值。下面的plot_fhandle函数接收一个函数句柄和数据

  • 我正在使用Spring WebFlux webclient进行REST调用。我将连接超时配置为毫秒,相应地: 方法将为每个/响应代码返回一个空的。如何对连接超时甚至读/写超时进行相同的操作。目前,它只是抛出一个,而不处理该异常

  • 我想在调用不存在的路由时覆盖Spring Boot默认结果: 我有一个 它适用于其他自定义异常。 我还在 application.properties 上添加(或删除了)此属性,但没有任何变化: spring.mvc.throw异常是否为空 Spring引导启动器父级是v.2.6.4