SpringMVC 全局异常处理

118 阅读1分钟

创建ExceptionResolver实现HandlerExceptionResolver接口:

@Slf4j
@Component
public class ExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        log.error("{} Exception",request.getRequestURI(),ex);
        ModelAndView modelAndView = new ModelAndView(new MappingJacksonJsonView());

        //使用MappingJackson2JsonView需要Jackson 2.x,这里引入的jackson是1.9版本,
        modelAndView.addObject("status",ResponseCode.ERROR.getCode());
        modelAndView.addObject("msg","接口异常,详情查看服务端日志");
        modelAndView.addObject("data", ex.toString());
        return modelAndView;
    }
}
  • 添加@Component注解,将该类添加到spring容器中,用于被扫描到。这里提一下@Service、@Component、@Repository这些注解实际并没有多大不同只是使用场景的区别:Repository一般用于dao层,Service用在service层,非这俩层的一般用Component
  • 这里不在返回视图信息而是通过MappingJacksonJsonView返回json信息,满足实际工作需要
  • 使用MappingJackson2JsonView需要Jackson 2.x,这里引入的jackson是1.9版本就使用的MappingJacksonJsonView
  • 通过modelAndView.addObject()返回打印信息,这里直接填入于前端约定好的格式就ok了。

### 在dispatcher-server中添加扫描:

<context:component-scan base-package="com.mmall.controller" annotation-config="true" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

直接扫描到controller下的controller注解。

创建接口用于异常测试:

    @RequestMapping(value = "test_error.do",method =  RequestMethod.GET)
    @ResponseBody
    public void testError(){
        int a = 0;
        int b = 500/a;
    }

接口请求返回到异常信息:

error