gpt4 book ai didi

java - SizeLimitExceededException 没有被 Spring ControllerAdvice 捕获?

转载 作者:行者123 更新时间:2023-12-04 16:05:37 24 4
gpt4 key购买 nike

在使用 Spring 的 Java 网络应用程序上,当我上传大于定义的最大大小时的文件时,将抛出 org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException

我希望它被我的自定义 ExceptionHandlingController.class 捕获,它用 @ControllerAdvice 注释并且成功捕获我喜欢处理的所有其他特定异常一些特定的逻辑;但不是这个

什么会导致这种有问题的行为,我该如何解决?

异常很明显:

Caused by: org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (174470507) exceeds the configured maximum (7000000)

最大文件大小在我的 applicationContext.xml 中定义如下:

<bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="7000000" /><!-- amount is in Bytes -->
</bean>

ExceptionHandlingController 类,有一些修订(无法在 SO 上获得很好的缩进......:):

@ControllerAdvice
public class ExceptionHandlingController {
private static final Logger NON_SECURITY_LOGGER = Logger.getLogger(ExceptionHandlingController.class);

@ExceptionHandler({MailSendException.class})
public RedirectView handleError(HttpServletRequest req, MailSendException exception) {
RedirectView rw = new RedirectView("/");
FlashMap outputFlashMap = RequestContextUtils.getOutputFlashMap(req);
outputFlashMap.put(Constants.FLASH_GENERIC, "Our mail service seems to have issues. Please try again or contact an administrator if the problem persists");
return rw;
}

// TODO THIS WON'T GET CAUGHT !!!!!!!!!!!!
@ExceptionHandler({FileUploadBase.SizeLimitExceededException.class})
public RedirectView handleError(HttpServletRequest req, FileUploadBase.SizeLimitExceededException exception) {
RedirectView rw = new RedirectView("/");
FlashMap outputFlashMap = RequestContextUtils.getOutputFlashMap(req);
outputFlashMap.put(Constants.FLASH_GENERIC, "Woops ! The file that you tried to upload is too large. Please respect the rules.");
return rw;
}

@ExceptionHandler({Exception.class})
public ModelAndView handleError(HttpServletRequest req, Exception exception) throws Exception {
NON_SECURITY_LOGGER.log(ERROR, "######### EXCEPTION #########", exception);
throw exception;
}}

web.xml 中:

<filter>
<async-supported>true</async-supported>
<filter-name>multipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>multipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

作为奖励,如果我可以在达到最大文件大小时抛出异常,而不是在整个上传结束后抛出异常,那就太好了;但这应该是一个单独的问题:)

注意:我确认异常没有被其他处理程序捕获。简直就是“绕过”一切。

感谢您的帮助! :)

=== 对验证答案的更新/反馈 ===

正如 Elevate 在经过验证的答案中指出的那样,我只是从 web.xml 中删除了过滤器,并将 bean 配置从 applicationContext.xml 切换到 dispatcher -servlet.xml(纯复制粘贴)。

此外,由于重新布线,ExceptionHandlingController 现在捕获 MaxUploadSizeExceededException 而不是 SizeLimitExceededException

异常现在被正确捕获;感谢 Elevate 的帮助!

最佳答案

您问:“什么会导致这种有问题的行为?”

Controller 周围应用了多部分过滤器,因此 Controller 看不到异常。它不会在 Controller 内部发生。

documentation for MultipartFilter 说它是为不使用 Spring 的 Web MVC 的用例设计的:

Note: This filter is an alternative to using DispatcherServlet's MultipartResolver support, for example for web applications with custom web views which do not use Spring's web MVC, or for custom filters applied before a Spring MVC DispatcherServlet.

你问,“我该如何解决这个问题?”

答案是(显然)将多部分处理放在 Controller 内部。 :)

您需要从 web.xml 中删除过滤器并配置 CommonsMultipartResolver 以在 Controller 范围内运行。我不知道你的 Controller 是如何配置的,所以你必须解决它或发布另一个问题!

关于java - SizeLimitExceededException 没有被 Spring ControllerAdvice 捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48891490/

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