使用SpringMVC MultipartFile上传文件,当上传文件超过限制时,使用 @ExceptionHandler 捕获了异常,但是后台仍然抛出了异常,而且前台无响应!问题有二:
1.为什么捕获的异常,又抛出了?
2.为什么响应没有返回呢?SpringMVC 的 CommonsMultipartResolver 配置与自定义的ExceptionHandlerExceptionResolver子类的配置:<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- Default is 10240, according to Commons FileUpload. -->
<property name="maxInMemorySize" value="10240"></property>
<!-- 临时文件目录
<property name="uploadTempDir" value="/WEB-INF/temp"></property> -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 指定所上传文件的总大小不能超过10M。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<property name="maxUploadSize" value="5242880"/><!-- 10485760 -->
<!-- 设置上传的单文件大小
<property name="maxUploadSizePerFile" value="2097152"/> --><!-- 5242880 -->
<!--resolveLazily属性启用是为了推迟文件解析,以便在 UploadController 中捕获文件大小异常 -->
<property name="resolveLazily" value="true"/>
</bean>
<!-- 处理适配器
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="cacheSeconds" value="0" />
<property name="messageConverters" ref="messageConverters" />
</bean> -->
<!-- Http messageConverters,用于将对象输出到客户端 -->
<util:list id="messageConverters">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json</value>
<value>application/javascript</value>
<value>text/json</value>
<value>text/javascript</value>
</list>
</property>
</bean>
</util:list>
<bean id="handlerExceptionResolver" class="com.*.common.exception.AnnotationHandlerMethodExceptionResolver">
<property name="defaultErrorView" value="error/exception"/>
<property name="messageConverters" ref="messageConverters"/>
</bean>
在 Controller 中定义处理异常的方法: @ExceptionHandler(Exception.class)
@ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR)
public ModelAndView handleException(Exception ex, HttpServletRequest request) {
System.out.println("######################### handleException capture this exception");
return new ModelAndView().addObject("error", "错误信息");
}
1.为什么捕获的异常,又抛出了?
2.为什么响应没有返回呢?SpringMVC 的 CommonsMultipartResolver 配置与自定义的ExceptionHandlerExceptionResolver子类的配置:<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- Default is 10240, according to Commons FileUpload. -->
<property name="maxInMemorySize" value="10240"></property>
<!-- 临时文件目录
<property name="uploadTempDir" value="/WEB-INF/temp"></property> -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 指定所上传文件的总大小不能超过10M。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<property name="maxUploadSize" value="5242880"/><!-- 10485760 -->
<!-- 设置上传的单文件大小
<property name="maxUploadSizePerFile" value="2097152"/> --><!-- 5242880 -->
<!--resolveLazily属性启用是为了推迟文件解析,以便在 UploadController 中捕获文件大小异常 -->
<property name="resolveLazily" value="true"/>
</bean>
<!-- 处理适配器
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="cacheSeconds" value="0" />
<property name="messageConverters" ref="messageConverters" />
</bean> -->
<!-- Http messageConverters,用于将对象输出到客户端 -->
<util:list id="messageConverters">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json</value>
<value>application/javascript</value>
<value>text/json</value>
<value>text/javascript</value>
</list>
</property>
</bean>
</util:list>
<bean id="handlerExceptionResolver" class="com.*.common.exception.AnnotationHandlerMethodExceptionResolver">
<property name="defaultErrorView" value="error/exception"/>
<property name="messageConverters" ref="messageConverters"/>
</bean>
在 Controller 中定义处理异常的方法: @ExceptionHandler(Exception.class)
@ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR)
public ModelAndView handleException(Exception ex, HttpServletRequest request) {
System.out.println("######################### handleException capture this exception");
return new ModelAndView().addObject("error", "错误信息");
}
解决方案 »
- struts中html:error 不能显示错误信息
- oracle优化查询的书籍
- 主题: 关于单点登陆--请兄弟们帮忙 !!!
- j2ee类库官方文档能下载吗?
- :[求助]请高人帮我指点一下,为什么我jsp和servlet的session没法共享使用?
- 有关Struts,在网页上取Bean的值时,有没有办法判断Bean里变量的长度,然后取前X位的长度呢?
- 目前功能最强,最流行的Java XML解析器是什么,列出前三。
- tomcat5.0 的问题,HTTP Status 404 - /manager/html
- 各位高手看看,这是不是java编译器的bug
- OAuth2认证,拿到access_token之后怎么用
- java项目中的config配置中的JFinal.start("WebRoot", 8088, "/", 5);这句代码是什么意思,怎么理解??求大神解答,感谢
- junit 单元测试,查询出来的是list是如何比较的?
private String defaultErrorView;
public String getDefaultErrorView() {
return defaultErrorView;
} public void setDefaultErrorView(String defaultErrorView) {
this.defaultErrorView = defaultErrorView;
} protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response,
HandlerMethod handlerMethod, Exception exception) {
if (handlerMethod == null) {
return null;
}
Method method = handlerMethod.getMethod(); if (method == null) {
return null;
}
ModelAndView returnValue = super.doResolveHandlerMethodException(request, response, handlerMethod, exception);
ResponseBody responseBodyAnn = AnnotationUtils.findAnnotation(method, ResponseBody.class);
if (responseBodyAnn != null) {
try {
ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(method, ResponseStatus.class);
if (responseStatusAnn != null) {
HttpStatus responseStatus = responseStatusAnn.value();
String reason = responseStatusAnn.reason();
if (!StringUtils.hasText(reason)) {
response.setStatus(responseStatus.value());
} else {
try {
response.sendError(responseStatus.value(), reason);
} catch (IOException e) { }
}
}
return handleResponseBody(returnValue, request, response);
} catch (Exception e) {
return null;
}
}
if(returnValue.getViewName() == null){
returnValue.setViewName(defaultErrorView);
}
return returnValue;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
private ModelAndView handleResponseBody(ModelAndView returnValue, HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Map value = returnValue.getModelMap();
HttpInputMessage inputMessage = new ServletServerHttpRequest(request);
List<MediaType> acceptedMediaTypes = inputMessage.getHeaders().getAccept();
if (acceptedMediaTypes.isEmpty()) {
acceptedMediaTypes = Collections.singletonList(MediaType.ALL);
}
MediaType.sortByQualityValue(acceptedMediaTypes);
HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);
Class<?> returnValueType = value.getClass();
List<HttpMessageConverter<?>> messageConverters = super.getMessageConverters();
if (messageConverters != null) {
for (MediaType acceptedMediaType : acceptedMediaTypes) {
for (HttpMessageConverter messageConverter : messageConverters) {
if (messageConverter.canWrite(returnValueType, acceptedMediaType)) {
messageConverter.write(value, acceptedMediaType, outputMessage);
return new ModelAndView();
}
}
}
}
if (logger.isWarnEnabled()) {
logger.warn("Could not find HttpMessageConverter that supports return type [" + returnValueType + "] and " + acceptedMediaTypes);
}
return null;
}}