MaxUploadSizeExceededException 不调用Spring中的异常处理方法 [英] MaxUploadSizeExceededException doesn't invoke the exception handling method in Spring

查看:25
本文介绍了MaxUploadSizeExceededException 不调用Spring中的异常处理方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是 Spring 3.2.0.根据 this 答案,我在带注释的控制器中有相同的方法,它实现了 HandlerExceptionResolver 接口比如,

I'm using Spring 3.2.0. According to this answer, I have the same method in my annotated controller which implements the HandlerExceptionResolver interface such as,

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 配置包括,

and the Spring configuration includes,

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

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

When the file size exceeds, the preceding method should be invoked and it should automatically handle the exception but it doesn't happen at all. The method resolveException() is never called even though the exception occurs. What is the way to handle this exception? Am I missing something?

同样的事情也在here.我不确定为什么它在我的情况下不起作用.

The same thing is also specified here. I'm not sure why it doesn't work in my case.

我已经尝试了 以下方法@ControllerAdvice 但它也不起作用.

I have tried the following approach with @ControllerAdvice but it didn't work either.

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);
    }
}

我也尝试过详细说明 - Exception.

I have also tried to put the verbose - Exception.

@ExceptionHandler(value={Exception.class})

ResponseEntity() 方法在任何情况下都不会被调用.

The method ResponseEntity() is never invoked in any case.

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

In general, I want to handle this exception per controller base (controller level), if possible. For this, one @ExceptionHandler annotated method should only be active for that particular controller, not globally for the entire application, since there are only a few web pages in my application that handle file uploading. When this exception is caused, I just want to show a user-friendly error message on the current page and not to redirect to the error page configured in the web.xml file. If this is not even feasible, then this exception should be handled anyway without any custom requirements I have just expressed.

两种方法都不适合我.我找不到更多关于处理这个异常的信息.它是否需要在 XML 文件或其他地方进行额外配置?

Neither of approaches worked for me. Nothing more about handling this exception I could find. Does it require additional configuration somewhere in XML files or otherwise?

抛出异常后我得到的内容可以在以下 快照中看到.

What I'm getting after the exception is thrown can be visible in the following snap shot.

推荐答案

根据您发布的堆栈跟踪,MaxUploadSizeExceeded 异常在请求到达调度程序 servlet 之前 被抛出.因此不会调用您的异常处理程序,因为在抛出异常时目标控制器尚未确定.

According to your posted stacktrace the MaxUploadSizeExceeded exception is thrown before the request has reached the dispatcher servlet. Therefore your exceptionhandler isn't called because at the point the exception is thrown the target controller has yet to be determined.

如果您查看堆栈跟踪,您可以看到异常在 HiddenHttpMethodFilter 中抛出,该代码获取您的多部分请求的所有参数 - 以及您的to big"上传数据参数.

If you look at the stacktrace you can see that the exception is thrown in the HiddenHttpMethodFilter that gets all parameters of your multipart-request - and also your "to big" upload-data parameter.

您的控制器是否需要处理分段上传的 HiddenHttpMethodFilter?如果没有,请从您的上传处理控制器中排除此过滤器.

Is the HiddenHttpMethodFilter needed for your controller handling the multipart-upload? If not, exclude this filter from your upload-handling controllers.

这篇关于MaxUploadSizeExceededException 不调用Spring中的异常处理方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆