springMVC使用@ControllerAdvice实现异常处理

118 篇文章 2 订阅

原文地址:http://blog.csdn.net/weililansehudiefei/article/details/73691294

@ControllerAdvice注解的类,会被作用于@RequesMapping注解的方法上。

先来看看它的基本实现

  1. @Target(ElementType.TYPE)  
  2. @Retention(RetentionPolicy.RUNTIME)  
  3. @Documented  
  4. @Component  
  5. public @interface ControllerAdvice {  

被Component注解,说明可以通过<context:component-scan>来扫描到。

在Web开发中,最基本的都是从Controller到Service再到DAO。在开发的过程中,会需要处理各种异常。Service异常往上抛,如果上层没有try-catch,就会出异常。而通过ControllerAdvice 注解,我们可以使得所有异常在controller进行处理,而开发过程中更加专注于业务的处理。

首先定义一个全局异常的处理类

  1. package com.creditease.microloan.mil.loanrepay.exception.handler;  
  2.   
  3. import com.alibaba.fastjson.JSONException;  
  4. import com.alibaba.fastjson.JSONObject;  
  5. import com.creditease.microloan.mil.loanrepay.exception.*;  
  6. import org.slf4j.Logger;  
  7. import org.slf4j.LoggerFactory;  
  8. import org.springframework.web.bind.MissingServletRequestParameterException;  
  9. import org.springframework.web.bind.annotation.ControllerAdvice;  
  10. import org.springframework.web.bind.annotation.ExceptionHandler;  
  11. import org.springframework.web.bind.annotation.ResponseBody;  
  12.   
  13. import javax.servlet.http.HttpServletRequest;  
  14.   
  15. /** 
  16.  * 全局异常处理类 
  17.  * <p> 
  18.  * Created by Kong on 17/6/12. 
  19.  */  
  20. @ControllerAdvice  
  21. public class GlobalExceptionHandler {  
  22.   
  23.     private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);  
  24.   
  25.     /** 
  26.      * 接口有参数未传 
  27.      */  
  28.     @ExceptionHandler(value = MissingServletRequestParameterException.class)  
  29.     @ResponseBody  
  30.     public JSONObject missActionParam(HttpServletRequest req, MissingServletRequestParameterException e) throws Exception {  
  31.         return makeErrorObj("接口有参数未传", req, e);  
  32.     }  
  33.   
  34.     /** 
  35.      * 加密解密错误 
  36.      */  
  37.     @ExceptionHandler(value = CryptException.class)  
  38.     @ResponseBody  
  39.     public JSONObject cryptError(HttpServletRequest req, CryptException e) throws Exception {  
  40.         return makeErrorObj("加密解密有误", req, e);  
  41.     }  
  42.   
  43.     /** 
  44.      * 数字格式错误 
  45.      */  
  46.     @ExceptionHandler(value = NumberFormatException.class)  
  47.     @ResponseBody  
  48.     public JSONObject numberFormatError(HttpServletRequest req, NumberFormatException e) throws Exception {  
  49.         return makeErrorObj("数字格式错误", req, e);  
  50.     }  
  51.   
  52.     /** 
  53.      * JSON格式解析错误 
  54.      */  
  55.     @ExceptionHandler(value = JSONException.class)  
  56.     @ResponseBody  
  57.     public JSONObject jsonError(HttpServletRequest req, JSONException e) throws Exception {  
  58.         return makeErrorObj("JSON格式解析错误", req, e);  
  59.     }  
  60.   
  61.     /** 
  62.      * 服务器内部错误 
  63.      */  
  64.     @ExceptionHandler(value = NullPointerException.class)  
  65.     @ResponseBody  
  66.     public JSONObject nullError(HttpServletRequest req, NullPointerException e) throws Exception {  
  67.         return makeErrorObj("服务器内部错误", req, e);  
  68.     }  
  69.   
  70.     /** 
  71.      * HTTP请求外部服务失败 
  72.      */  
  73.     @ExceptionHandler(value = HTTPConnException.class)  
  74.     @ResponseBody  
  75.     public JSONObject requestError(HttpServletRequest req, HTTPConnException e) throws Exception {  
  76.         return makeErrorObj("HTTP请求外部服务失败", req, e);  
  77.     }  
  78.   
  79.     /** 
  80.      * 绑卡错误 
  81.      */  
  82.     @ExceptionHandler(value = CardException.class)  
  83.     @ResponseBody  
  84.     public JSONObject payError(HttpServletRequest req, CardException e) throws Exception {  
  85.         return makeErrorObj("绑卡错误", req, e);  
  86.     }  
  87.   
  88.     /** 
  89.      * 支付失败 
  90.      */  
  91.     @ExceptionHandler(value = PayException.class)  
  92.     @ResponseBody  
  93.     public JSONObject payError(HttpServletRequest req, PayException e) throws Exception {  
  94.         return makeErrorObj("支付失败", req, e);  
  95.     }  
  96.   
  97.     /** 
  98.      * 第三方支付API返回错误 
  99.      */  
  100.     @ExceptionHandler(value = ThirdPartyPaymentException.class)  
  101.     @ResponseBody  
  102.     public JSONObject thirdPayError(HttpServletRequest req, ThirdPartyPaymentException e) throws Exception {  
  103.         return makeErrorObj("第三方支付API返回错误", req, e);  
  104.     }  
  105.   
  106.     /** 
  107.      * 查询还款计划错误 
  108.      */  
  109.     @ExceptionHandler(value = RepaymentScheduleException.class)  
  110.     @ResponseBody  
  111.     public JSONObject scheduleError(HttpServletRequest req, RepaymentScheduleException e) throws Exception {  
  112.         return makeErrorObj("查询还款计划错误", req, e);  
  113.     }  
  114.   
  115.     /** 
  116.      * 未知错误 
  117.      */  
  118.     @ExceptionHandler(value = Exception.class)  
  119.     @ResponseBody  
  120.     public JSONObject scheduleError(HttpServletRequest req, Exception e) throws Exception {  
  121.         return makeErrorObj("未知错误", req, e);  
  122.     }  
  123.   
  124.     /** 
  125.      * 构造错误信息 
  126.      * 
  127.      * @param msg 错误描述 
  128.      * @param e   异常信息 
  129.      * @return 
  130.      */  
  131.     private JSONObject makeErrorObj(String msg, HttpServletRequest req, Exception e) {  
  132.         JSONObject obj = new JSONObject();  
  133.         obj.put("status""fail");  
  134.         obj.put("msg", msg + " (" + e.getMessage() + ")");  
  135.         JSONObject logObj = new JSONObject();  
  136.         logObj.put("status""fail");  
  137.         logObj.put("msg", msg);  
  138.         logObj.put("error", e.getMessage());  
  139.         logObj.put("url", req.getRequestURL());  
  140.         logObj.put("field", req.getParameterMap());  
  141.         logger.error(logObj.toJSONString(), e);  
  142.         return obj;  
  143.     }  
  144.   
  145. }  

通过注解@ExceptionHandler指定异常类型,当被@RequestMapping注解的方法抛出相应的类的异常,就执行相应的异常处理逻辑。

当然我们需要自异常处理类型,比如CryptException,

  1. package com.creditease.microloan.mil.loanrepay.exception;  
  2.   
  3. /** 
  4.  * Created by weili on 17/6/19. 
  5.  */  
  6. public class CryptException extends RuntimeException{  
  7.   
  8.     public CryptException(String message){super(message);}  
  9.   
  10.     public CryptException(String message,Throwable cause){super(message,cause);}  
  11.   
  12.     public CryptException(Throwable cause){super(cause);}  
  13. }  
当然可以自定义多种异常的类型,然后在GlobalExceptionHandler.java中进行处理。这样整个工程的所有的所有异常被集中到一个地方,方便增加和删除,也极大的方便业务的开发。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值