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

MaxUploadsizeAccurededException不调用Spring中的异常处理方法

壤驷兴朝
2023-03-14

我使用的是Spring3.2.0。根据这个答案,我在我的注释控制器中有相同的方法,它实现HandlerExceptionResolver接口,

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) {

    Map<String, Object> model = new HashMap<String, Object>(0);

    if (exception instanceof MaxUploadSizeExceededException) {
        model.put("msg", exception.toString());
        model.put("status", "-1");
    } else {
        model.put("msg", "Unexpected error : " + exception.toString());
        model.put("status", "-1");
    }

    return new ModelAndView("admin_side/ProductImage");
}

Spring配置包括,

<bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize">
        <value>10000</value>
    </property>
</bean>

当文件大小超过时,应该调用前面的方法,它应该自动处理异常,但它根本不会发生。即使发生异常,也不会调用resolveException()方法。处理此异常的方法是什么?我是不是漏掉了什么?

package exceptionhandler;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public final class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = {MaxUploadSizeExceededException.class})
    protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest request) {
        String bodyOfResponse = "This should be application specific";
        return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), HttpStatus.CONFLICT, request);
    }
}
@ExceptionHandler(value={Exception.class})

在任何情况下都不会调用responseentity()方法。

一般来说,如果可能的话,我希望每个控制器基(控制器级别)处理此异常。为此,一个@ExceptionHandler注释方法应该只对该特定控制器有效,而不是对整个应用程序全局有效,因为我的应用程序中只有几个web页面处理文件上载。当出现此异常时,我只想在当前页上显示一条用户友好的错误消息,而不是重定向到web.xml文件中配置的错误页。如果这是不可行的,那么无论如何都应该处理这个异常,而不需要我刚才表达的任何自定义要求。

这两种方法对我都不起作用。我找不到更多关于处理此异常的信息。它是否需要在XML文件中的某个地方或其他地方进行额外的配置?

共有1个答案

子车海
2023-03-14

根据发布的stacktrace,在请求到达dispatcher servlet之前抛出MaxuploadsizeExcepted异常。因此,您的exceptionhandler不会被调用,因为在抛出异常时,目标控制器尚未确定。

如果查看stacktrace,可以看到异常抛出在HiddenhTtpMethodFilter中,它获取multipart-request的所有参数以及“to big”upload-data参数。

控制器处理多部分上传是否需要HiddenhTtpMethodFilter?如果没有,请从上传处理控制器中排除此筛选器。

 类似资料:
  • 我正在为Spring MVC中的异常处理开发示例演示应用程序。我正在尝试使用@ControllerAdvice处理异常 我遵循了本链接中描述的步骤。 但是当我运行我的应用程序时,我得到了以下错误 以下是我正在学习的课程 应用程序异常。JAVA 控制器类 ApplicationExceptionController。JAVA 下面是GlobalExceptionHandler类 GlobalExce

  • 我是Spring Boot的新手。在一个项目中,我想异步发送一封电子邮件。下面,你可以看到我到目前为止有什么。 我遇到的一个问题是:外部系统向控制器发送POST请求。如果在生成或发送邮件时发生异常,则不会调用。因此,控制器总是返回HTTP 201,因此调用者认为一切正常。 我将如何集成我的异常处理程序与在这样的异步方法? 控制器 服务 异常处理程序

  • 我有一个Spring Boot服务,其中包含一些用于并行异步调用的代码,如下所示: CompletableFuture future1=accountManager。getResult(url1); CompletableFuture future2=accountManager。getResult(url2); 复杂的Future.allOf(未来1,未来2)。 字符串result1=futur

  • 我试图在一个具有SOAPendpoint和Rest控制器的Spring Boot应用程序中处理异常。 提前谢谢你。

  • 我对Spring批处理跳过逻辑有一些问题。我已经配置了一个作业的步骤来跳过两个异常(SQLIntegrityConstraintViolation异常和乐观锁定失败异常): 但当作业运行时,由于我将其配置为跳过的异常,作业以未知状态完成: 我做错什么了吗?我希望这一步跳过负责抛出其中一个异常的项,并继续处理,以便以完成状态结束。

  • 我有以下方法: 在序列化期间调用。 枚举异常扩展了异常 我的控制器方法: 事务类: 在此setter中,引发枚举异常 在调试方法时,我看到它正在从响应EntityExceptionHandler类调用方法而不是我的方法 在抛出EnumException的情况下,我得到400状态代码和空响应正文。 为什么不执行异常处理程序方法? 以下是日志: