- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在使用 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/
我可以定义一个 Spring ControllerAdvice,它由使用自定义注解的 Controller 子集有选择地使用: @RestController @UseAdviceA @Request
这是 web 入口点的主 Controller @Controller @RequestMapping("/webapp") public class WebAppController { @Requ
我有一个 Spring 4 应用程序,其中包含多个用 @Order(someValue) 注释的 ControllerAdvices。此外,我在我的一个外部库中发现了一个 ControllerAdvi
实现前的准备工作 @ControllerAdvice注解的简单介绍 @ControllerAdvice注解作用是给Controller控制器添加统一的操作或处理。 对于@ControllerAdvic
我一直在关注一些有关使用 Spring 框架进行错误处理的教程。我的handleNullPointer方法确实捕获了空指针异常。但是,我想知道该方法之后返回到哪里,因为我想在前端(网页)上显示错误的一
有没有办法从 @ControllerAdvice 获得控制权的地方获取类。 即:如果 PersonController 的执行正在进行,并且我收到一些错误,由于控制权转移到 @ControllerAd
我有一个用 @ControllerAdvice 注释的类,为我的 api 提供了一些中央异常处理。它处理的异常之一是 MethodArgumentNotValidException,当用 @Valid
我想将响应正文设置为异常的错误消息: @ControllerAdvice public class RestResponseEntityExceptionHandler extends Respons
实际上,我在一个单独的项目中使用 @ControllerAdvice 为我的 Sprint 启动项目编写了一个全局 ExceptionHandling,现在我想从另一个项目调用它,但似乎它不起作用,因
我有一个 REST 服务,我需要使用自定义 json 响应发送适当的状态代码,这解释了错误的原因。 我有@Controller类,它公开了一个服务/test,在访问该服务时,我抛出了一个自定义异常(扩
我已经浏览了所有相关的帖子,但我的@ControllerAdvice似乎没有处理从 Controller 类抛出的自定义异常。但是@Controller类中的@ExceptionHandler确实处理
我正在开发一个 Spring MVC/Webflow 应用程序(版本 3.2)并尝试让异常处理工作,我可以在其中将自定义异常消息输出到日志文件和 error.jsp。我遇到的问题是异常处理程序没有被解
我正在为 Spring MVC 中的异常处理开发示例演示应用程序。我正在尝试使用@ControllerAdvice 进行异常处理 我按照 this 中描述的步骤进行操作链接。 但是当我运行我的应用程序
我有以下 Controller 类 package com.java.rest.controllers; @Controller @RequestMapping("/api") public clas
在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@Req
我有 SimpleMappingExceptionResolver像这样配置。 @Bean(name = "simpleMappingExceptionResolver") public Simple
我不知道为什么,但 @ControllerAdvice覆盖在 Exception 处定义的响应代码级别使用 @ResponseStatus注解。 异常(exception) : @ResponseSt
我制作了一个用于监听异常的通用项目并使用 @ControllerAdvice与 @ExceptionHandler @ControllerAdvice(annotations = RestContro
在我的 REST 服务应用程序中,我计划创建一个 @ControllerAdvice捕获 Controller 抛出的异常并返回 ResponseEntity 的类对象根据错误类型。 但我已经有一个
@RestControllerAdvice 和 @ControllerAdvice 之间的主要区别是什么? 我们是否应该始终将 @RestControllerAdvice 用于休息服务和 @Contr
我是一名优秀的程序员,十分优秀!