spring MVC 文件上传的MaxUploadSizeExceededException异常处理

来源:互联网 发布:mac os x卸载软件 编辑:程序博客网 时间:2024/05/17 08:31

spring MVC上传文件使用了common.fileupload组件,该组件上传文件的时候有个文件大小的限制,在超出这个限制之后.会抛出MaxUploadSizeExceededException异常.

该异常是spring检查上传文件的信息的时候抛出的,此时还没进入Controller内解析文件的方法中.


网上查到的方法是:

1 使用org.springframework.web.servlet.handler.SimpleMappingExceptionResolver,如:

[html] view plaincopy
  1. <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
  2.     <property name="exceptionMappings">  
  3.    <props>  
  4.         <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error/maxUploadExceeded</prop>  
  5.    </props>   
  6. </property>  
个人更赞成这种方式,因为multipartResolver通常是全局使用的,指定的maxUploadSize通常也是全局的,这里应该配置一个全局异常处理来响应。

自己实现.HandlerExceptionResolver类,如
[java] view plaincopy
  1. public class MyHandlerExceptionResolver implements HandlerExceptionResolver {  
  2.     private Log log = LogFactory.getLog(getClass());  
  3.     public ModelAndView resolveException(HttpServletRequest request,  
  4.             HttpServletResponse response, Object handler, Exception ex) {  
  5.         log.warn("Handle exception: " + ex.getClass().getName());  
  6.                 
  7.         Map model = new HashMap();  
  8.         model.put("ex", ex.getClass().getSimpleName());  
  9.         model.put("error", ex.getMessage());  
  10.         return new ModelAndView("error", model);  
  11.     }  

另定义<bean class="MyHandlerExceptionResolver "/>


这两种方法的侵入性真的太大了,查看源代码org.springframework.web.multipart.commons.CommonsMultipartResolver 127行

[java] view plaincopy
  1. if (this.resolveLazily) {  
  2.             return new DefaultMultipartHttpServletRequest(request) {  
  3.                 @Override  
  4.                 protected void initializeMultipart() {  
  5.                     MultipartParsingResult parsingResult = parseRequest(request);  
  6.                     setMultipartFiles(parsingResult.getMultipartFiles());  
  7.                     setMultipartParameters(parsingResult.getMultipartParameters());  
  8.                 }  
  9.             };  
  10.         }  

有个resolveLazily属性,一个类似懒加载的属性.可以定义该属性.让解析文件的时候再抛异常,然后Controller中定义异常处理的方法

[html] view plaincopy
  1. <bean id="multipartResolver"  
  2.         class="org.springframework.web.multipart.commons.CommonsMultipartResolver"  
  3.         p:defaultEncoding="utf-8" >  
  4.       <property name="resolveLazily" value="true"/>  
  5.       <property name="maxUploadSize" value="1024" />  
  6.     </bean>  
定义异常处理的方法

[java] view plaincopy
  1. @ExceptionHandler(Exception.class)       
  2.     public String handleException(Exception ex,HttpServletRequest request) {     
  3.         if(ex instanceof org.springframework.web.multipart.MaxUploadSizeExceededException){  
  4.             request.setAttribute("error""文件超过长度");  
  5.         }  
  6.         return "要转向的页面,可以自由定义或者是原页面.";  
  7.     }