Spring:结合实训项目实现SpringMVC全局异常处理

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;
    }
}
4.2 全局异常处理结果

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值