SpringMVC 全局异常处理学习
一、SpringMVC全局异常流程图
二、Spring及SpringMVC扫描包隔离及配置文件优化
2.1 spring容器配置文件applicationContext.xml
<context:annotation- config/>是用来使@Autowired、@Resource等注解起作用的,也就是说激活已经在application context中注册的bean,让已经注册的bean在别的类中可以工作,而且在spring容器中描扫的时候不应该扫描controller,让controller文件给springMVC扫描
<context:component-scan base-package="cn.lnsf" annotation-config="true">
<!--这里代表在spring容器中扫描所有的bean,但是排除controller这个注解-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<aop:aspectj-autoproxy/>
<import resource="applicationContext-datasource.xml"/>
<import resource="applicationContext-spring-session.xml"/>
2.2 applicationContext-datasource.xml
由于上述的applicationContext.xml已经存在扫描了,可以将实训项目的applicationContext-datasource.xml的扫描功能进行注释
<!--<context:component-scan base-package="cn.lnsf" annotation-config="true"/>-->
2.3 springMVC包扫描配置文件dispatcher-servlet.xml
让springMVC只扫描@Controller这个注解,context:include-filter设置白名单,因为只扫描controller,就可以关闭默认扫描use-default-filters=“false”,
<!-- 定义扫描装载的包 -->
<context:component-scan base-package="cn.lnsf.controller" annotation-config="true" use-default-filters="false">
<!--这里代表扫描的时候只扫描controller-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
三、实训项目当前异常处理方式
3.1 在登录方法中加入运行时异常
@RequestMapping(value = "login.do",method = RequestMethod.POST)
@ResponseBody
public ServerResponse<User> login(String username, String password, HttpSession session, HttpServletResponse httpServletResponse){
//测试全局异常,除0抛出异常
int i =0;
int j =666/i;
ServerResponse<User> response = iUserService.login(username,password);
if(response.isSuccess()){
session.setAttribute(Const.CURRENT_USER,response.getData());
System.out.println(session.getId());
//CookieUtil.writeLoginToken(httpServletResponse,session.getId());
//CookieUtil.readLoginToken(httpServletRequest);
//CookieUtil.delLoginToken(httpServletRequest,httpServletResponse);
//RedisShardedPoolUtil.setEx(session.getId(), JsonUtil.obj2String(response.getData()), Const.RedisCacheExtime.REDIS_SESSION_EXTIME);
}
return response;
}
3.2 异常测试
客户端会显示除零异常,网页中也会具体的显示出在哪个类下的哪个方法出现错误,这对于上线项目可能会产生不好的影响,所以需要处理全局异常
四、全局异常处理
4.1创建处理全局异常的类ExceptionResolver
通过实现spring的HandlerExceptionResolver接口来捕获所有的异常,从而实现全局异常处理
@Slf4j
//用Component将ExceptionResolver注册到spring容器
@Component
public class ExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
//打印日志到后台
log.error("{} Exception,",httpServletRequest.getRequestURI(),e);
//将ModelAndView转换为JsonView
//当项目使用的时jackson2.x的时候使用MappingJackson2JsonView
//由于实训项目中maven依赖中使用1.9,则使用MappingJacksonJsonView
ModelAndView modelAndView = new ModelAndView(new MappingJacksonJsonView());
modelAndView.addObject("status", ResponseCode.ERROR.getCode());
modelAndView.addObject("msg","接口异常,详情请查看服务端的异常");
modelAndView.addObject("data",e.toString());
return modelAndView;
}
}