其实自己一直有想把自己的项目弄的越简洁越好,不用把项目中每个方法看起来比较臃肿,所以自己没事就去论坛,博客看别人怎么整合
今天特意写一些自己上个项目中用到的异常全局拦截处理
springmvc有三种方式
1.使用springmvc提供简单异常处理器simpleMappingException
2.实现spring的异常处理接口handleerExceptionResolver自定义处理异常
3.使用 @ExceptionHandler注解实现遗产处理
SimpleMappingExceptionResolver:
springMVC-servlet.xml
- <beanclassbeanclass="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
- 定义默认的异常处理页面,当该异常类型的注册时使用
- <property name="defaultErrorView" value="error">
- </property>
- 定义异常处理页面用来获取异常信息的变量名,默认名为exception
- <propertynamepropertyname="exceptionAttribute"value="ex"></property>
- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常也页名作为值
- <property name="exceptionMappings">
- <props>
- <propkeypropkey="etc.exception.MyException">error-my</prop>
- 这里还可以继续扩展对不同异常类型的处理
- </props>
- </property>
- </bean>
HandlerExceptionResolver :
- public class MyExceptionHandler{
-
- @ExceptionHandler
- public ModelAndView resolveException(HttpServletRequest request,
- HttpServletResponse response, Object handler, Exception ex) {
- Map<String, Exception> map = new HashMap<String, Exception>();
- map.put("ex",ex);
-
-
- if (ex instanceof MyException) {
- return new ModelAndView("error-my",map);
- } else {
- return new ModelAndView("error",map);
- }
- }
- }
定义了这样一个异常处理器之后就要在springMVC-servlet.xml中定义这样一个bean对象,如
- <bean id="myExceptionHandler" class="com.tiantian.xxx.web.handler.myExceptionHandler"/>
使用@ExceptionHandler进行处理:
使用@ExceptionHandler进行处理有一个不好的地方是进行异常处理的方法必须与出错的方法在同一个Controller里面
如:
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.ExceptionHandler;
- import org.springframework.web.bind.annotation.RequestMapping;
-
- import com.tiantian.blog.web.servlet.MyException;
-
-
@ExceptionHandler
@ResponseBody
public String exp(HttpServletRequest request, Exception ex) {
request.setAttribute("ex", ex);
// 根据不同错误转向不同页面
if(ex instanceof NullPointerException) {
return CtrUtils.toWxResultFormat(12133, "NullPointerException异常:" + ex.getMessage());
}else if(ex instanceof IllegalArgumentException ) {
logger.error("ParameterException exception异常");
return CtrUtils.toWxResultFormat(12134, "ParameterException exception异常");
}else if (ex instanceof org.springframework.web.multipart.MaxUploadSizeExceededException){
return CtrUtils.toWxResultFormat(10113, "图片大小不能超过5M");
}else {
return CtrUtils.toWxResultFormat(12135,ex.getMessage());
}
}
-
这里在页面上访问test方法的时候就会报错,而拥有该test方法的Controller又拥有一个处理该异常的方法,这个时候处理异常的方法就会被调用
当发生异常的时候,上述两种方式都使用了的时候,第一种方式会将第二种方式覆盖
这个项目中我使用了第三种,并且在每个controller中继承这个
GlobalController ,实现整个项目的全局异常拦截