@ControllerAdvice注解,实现异常的统一处理

一、介绍

  1. @ControllerAdvice注解是Spring3.2中新增的注解,作用是给Controller控制器添加统一的操作或处理,当然包含对异常的处理。

二、实现

  1. 自定义一个GlobalExceptionHandler,并添加注解@ControllerAdvice(basePackages = {"com.xxx.controller"})
    这个basePackages 表示哪些controller需要这个GlobalExceptionHandler处理异常。代码如下:
@ControllerAdvice(basePackages = {"cn.xxx.controller"})
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 处理全局的异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(HuiXunBaseException.class)
    @ResponseBody
    WebResponse handleException(HttpServletRequest request, HuiXunBaseException e) {
        HashMap data = Maps.newHashMap();
        data.put("url", request.getRequestURL().toString());
        data.put("params", e.getParams());
        log.error("", e);
        return WebResponse.getInitWebResponse(e.getStatus(), e.getMessage(), data);
    }
}

注意一下,这个方法(handleException)的参数。如果有自定的参数的话,这个异常的处理方法是不生效的,原因可以自行了解。@ResponseBody表示异常处理的返回给客户端的结果是以json字符串的形式处理,当然也可以使用其他的形式,比如ModelAndView。

  1. 自定义的异常代码:
    自定义基类异常的代码:
/**
 * @author ww
 * @version 1.0
 * @Date 2019/12/12
 */
@Data
@NoArgsConstructor
public class HuiXunBaseException extends Exception{

    /**
     * 响应给客户端的状态码
     */
    private int status;

    /**
     * 异常产生的方法的 参数
     */
    private Object params;

    /**
     *
     * @param msg
     */
    public HuiXunBaseException(String msg){
        super(msg);
    }
    public HuiXunBaseException(int status, String msg, Object params){
        super(msg);
        this.status = status;
        this.params = params;
    }
}

自定义业务异常的代码:

/**
 * @author ww
 * @version 1.0
 * @Date 2019/12/12
 */
public class BSVBusinessException extends HuiXunBaseException {
    /**
     * @param status
     * @param msg
     * @param params
     */
    public BSVBusinessException(int status, String msg, Object params) {
        super(status, msg, params);
    }
}
  1. 统一响应给客户端的格式代码:
/**
 * @author ww
 * @version 1.0
 * @Date 2019/5/27
 */
@Data
public class WebResponse {
    public static class STATUS {
        // 正常
        public static final int STATUS_OK = 0;

        // 业务异常
        public static final int BIZ_ERROR = 5;
        
    }

    public static class MESSAGE {
        public static final String BIZ_ERROR_MESSAGE = "业务异常";
    }

    //请求状态,0: 正常返回, 1:系统异常, 2:权限错误, 3:参数错误, 4:业务异常
    private int status = STATUS.STATUS_OK;

    //请求数据
    private T data;

    //错误码信息
    private String message;

    public WebResponse(int status, T data, String message) {
        this.status = status;
        this.data = data;
        this.message = message;
    }

    public WebResponse() {
    }

    public  E status(int status) {
        setStatus(status);
        return (E) this;
    }

    public  E data(T data) {
        setData(data);
        return (E) this;
    }

    public  E message(String message) {
        setMessage(message);
        return (E) this;
    }

    /**
     * 处理是否成功
     */
    public boolean isSuccess() {
        return this.status == STATUS.STATUS_OK;
    }

    public static WebResponse getInitWebResponse(int status, String message, Object data){
        WebResponse webResponse = new WebResponse<>();
        webResponse.setStatus(status);
        webResponse.setMessage(message);
        webResponse.setData(data);
        return webResponse;
    }
}

  1. 测试Controller
/**
 * @author ww
 * @version 1.0
 * @Date 2019/12/12
 */
@RestController
@RequestMapping(value = "/test")
public class TestExceptionController {

    /**
     * @return
     */
    @RequestMapping(value = "/exception", method = RequestMethod.GET)
    public WebResponse test(@RequestParam(value = "param") String param) throws HuiXunBaseException {
        throw new BSVBusinessException(WebResponse.STATUS.BIZ_ERROR, "发生异常啦", param);
    }
}
  1. 测试结果如下图:


    @ControllerAdvice注解,实现异常的统一处理_第1张图片
    image.png

你可能感兴趣的:(@ControllerAdvice注解,实现异常的统一处理)