【问题标题】:Handling MaxUploadSizeExceededException in Spring webapp在 Spring webapp 中处理 MaxUploadSizeExceededException
【发布时间】:2014-08-30 11:17:36
【问题描述】:

我正在尝试处理最大上传大小异常,但我发现所有解决方案都失败了,我尝试实现HandlerExceptionResolver@ControllerAdvice@ExceptionHandler(MaxUploadSizeExceededException.class) 注释的方法,但没有任何帮助。 在类似问题的答案中,我发现这可能是因为在调用控制器之前引发了异常,但我对这个问题没有这样的洞察力,所以我无法自己解决。
堆栈跟踪:

org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 500000 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (1065736) exceeds the configured maximum (500000)
    at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:160)
    at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:139)
    at org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:110)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (1065736) exceeds the configured maximum (500000)
    at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:965)
    at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:310)
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:334)
    at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115)
    at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:156)
    ... 20 more

以及我处理多部分解析的代码的某些部分等等......
SecurityWebAppInitializer.class - 我怀疑这个 MultipartFilter 可能是问题的一部分,但它必须存在,因为这个http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html#csrf-multipartfilter

@Order(1)
public class SecurityWebAppInitializer extends AbstractSecurityWebApplicationInitializer {

    @Override
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
        insertFilters(servletContext, new MultipartFilter());
    }

}

多部分配置

@Configuration
public class MultipartConfig {

    @Bean 
    public MultipartResolver filterMultipartResolver() {
        CommonsMultipartResolver filterMultipartResolver = new CommonsMultipartResolver();
        filterMultipartResolver.setMaxUploadSize(500000);

        return filterMultipartResolver;
    }        
}

WebAppInitializer.class

@Order(2)
public class WebAppInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] {MultipartConfig.class, SecurityConfig.class, PersistenceConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { DispatcherConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    protected Filter[] getServletFilters() {

        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        return new Filter[] { characterEncodingFilter};
    }

}

如果您需要 webapp 的其他部分,请询问。 提前致谢

【问题讨论】:

标签: eclipse spring tomcat multipartform-data


【解决方案1】:

如果您不知道最大上传大小,则不要设置最大上传大小。 如果你想限制最大上传大小,那么你需要考虑否则评论它 下面我评论了设置最大上传大小的设置器。

@Configuration
public class MultipartConfig {

    @Bean 
    public MultipartResolver filterMultipartResolver() {
        CommonsMultipartResolver filterMultipartResolver = new CommonsMultipartResolver();
        //filterMultipartResolver.setMaxUploadSize(500000);

        return filterMultipartResolver;
    }        
}

【讨论】:

  • 也是一个解决方案:D 感谢上帝,我只是在制作示例 webapp。无论如何,如果有人找到设置最大上传大小的解决方案,我非常希望看到它:)
【解决方案2】:

我被这个班级抓到了:

@Controller
public class ExceptionHandlerController implements ErrorController, HandlerExceptionResolver{
private static final String PATH = "/error";

Logger log = LoggerFactory.getLogger(ExceptionHandlerController.class);

public String getErrorPath() {
    return PATH;
}

@Override
public ModelAndView resolveException(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception exception) {
    log.debug("Captured....");
    Map<Object, Object> model = new HashMap<Object, Object>();
    //all the exception is here and u can specified it by this exception: MaxUploadSizeExceededException
    return new ModelAndView("Error", (Map) model);
}
}

我用的是SpringBoot,所以需要我实现ErrorController。如果你不这样做,则不需要实现它。

希望对寻找这种情况的人有所帮助。

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 2015-04-25
    • 2011-02-11
    • 2021-09-18
    • 2012-12-27
    • 1970-01-01
    • 2015-03-17
    • 2012-01-03
    • 2014-07-14
    相关资源
    最近更新 更多