二.统一异常处理器

对dao、service及action所抛出的异常进行统一处理,在action中就不需要添加try{}catch{}捕获的代码。

 

 

 

 

 

1.1.1     自定义异常处理器编写

 

自定义全局异常处理器,实现HandlerExceptionResolver接口

 

 

public class ExceptionResolverCustom implements HandlerExceptionResolver {

 

   // json转换器

   // 将异常信息转json

   private HttpMessageConverter<ExceptionResultInfo>jsonMessageConverter;

 

   // 前端控制器调用此方法执行异常处理

   // handler,执行的action类就包装了一个方法(对应url的方法)

   @Override

   public ModelAndView resolveException(HttpServletRequest request,

         HttpServletResponse response, Objecthandler, Exception ex) {

 

      // 输出异常信息

      ex.printStackTrace();

      // 转成springmvc底层对象(就是对action方法的封装对象,只有一个方法)

      HandlerMethod handlerMethod =(HandlerMethod) handler;

      // 取出方法

      Method method = handlerMethod.getMethod();

 

      // 判断方法是否返回json

      // 只要方法上有responsebody注解表示返回json

      // 查询method是否有responsebody注解

      ResponseBody responseBody = AnnotationUtils.findAnnotation(method,

            ResponseBody.class);

      if (responseBody !=null) {

         // 将异常信息转json输出

         return this.resolveJsonException(request, response, handlerMethod,

                ex);

 

      }

      // 这里说明action返回的是jsp页面

 

      // 解析异常

      ExceptionResultInfo exceptionResultInfo =resolveExceptionCustom(ex);

 

      // 将异常信息在异常页面显示

      request.setAttribute("exceptionResultInfo",

            exceptionResultInfo.getResultInfo());

 

      // 转向错误页面

      ModelAndView modelAndView = new ModelAndView();

      modelAndView.addObject("exceptionResultInfo",

            exceptionResultInfo.getResultInfo());

      modelAndView.setViewName("/base/error");//逻辑视图名

      return modelAndView;

   }

 

   // 异常信息解析方法

   private ExceptionResultInfo resolveExceptionCustom(Exception ex) {

      ResultInfo resultInfo = null;

      if (ex instanceof ExceptionResultInfo) {

         // 抛出的是系统自定义异常

         resultInfo = ((ExceptionResultInfo)ex).getResultInfo();

      } else {

         // 重新构造未知错误异常

         resultInfo = new ResultInfo();

         resultInfo.setType(ResultInfo.TYPE_RESULT_FAIL);

         resultInfo.setMessage("未知错误!");

      }

 

      return new ExceptionResultInfo(resultInfo);

 

   }

 

   // 将异常信息转json输出

   private ModelAndView resolveJsonException(HttpServletRequest request,

         HttpServletResponse response, Objecthandler, Exception ex) {

 

      // 解析异常

      ExceptionResultInfo exceptionResultInfo =resolveExceptionCustom(ex);

     

      HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);

     

      try {

         //exceptionResultInfo对象转成json输出

         jsonMessageConverter.write(exceptionResultInfo,MediaType.APPLICATION_JSON, outputMessage);

      } catch (HttpMessageNotWritableException e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      } catch (IOException e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      }

     

 

      return new ModelAndView();

 

   }

 

   public HttpMessageConverter<ExceptionResultInfo> getJsonMessageConverter(){

      return jsonMessageConverter;

   }

 

   public void setJsonMessageConverter(

         HttpMessageConverter<ExceptionResultInfo>jsonMessageConverter) {

      this.jsonMessageConverter = jsonMessageConverter;

   }

 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值