Spring REST API异常处理机制

@ControllerAdvice

  1. @ControllerAdvice是一个@Component,用于定义@ExceptionHandler,@InitBinder和@ModelAttribute方法,适用于所有使用@RequestMapping方法。
  2. Spring4之前,@ControllerAdvice在同一调度的Servlet中协助所有控制器。Spring4已经改变:@ControllerAdvice支持配置控制器的子集,而默认的行为仍然可以利用。
  3. 在Spring4中, @ControllerAdvice通过annotations(), basePackageClasses(), basePackages() 方法定制用于选择控制器子集。

@ExceptionHandler

可以对web的服务器端运行错误, 做统一的处理

实现方式

一.定义全局捕获异常

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    public GlobalExceptionHandler() {
    }
    //ServiceException自定义业务异常
    @ExceptionHandler({ServiceException.class})
    public BaseResult baseExceptionHandler(HttpServletResponse response, ServiceException ex) {
        this.logger.error(ex.getMessage(), ex);
        return new BaseResult(ex.getCode(), ex.getMessage());
    }

    @ExceptionHandler({Exception.class})
    public BaseResult otherExceptionHandler(HttpServletResponse response, Exception ex) {
        this.logger.error(ex.getMessage(), ex);
        return new BaseResult(ResultCode.SERVER_ERROR, ex.getMessage());
    }
}

2.定义公共异常。

public class ServiceException extends RuntimeException {
    private int code;

    public ServiceException() {
        this.code = ResultCode.ERROR;
    }

    public ServiceException(BaseExceptionMsg baseExceptionMsg) {
        this(baseExceptionMsg.getExpCode(), baseExceptionMsg.getExpMsg());
    }

    public ServiceException(int code, String message) {
        super(message);
        this.code = ResultCode.ERROR;
        this.code = code;
    }

    public ServiceException(String message, Throwable cause, int code) {
        super(message, cause);
        this.code = ResultCode.ERROR;
        this.code = code;
    }

    public ServiceException(String message) {
        super(message);
        this.code = ResultCode.ERROR;
    }

    public ServiceException(String message, Throwable cause) {
        super(message, cause);
        this.code = ResultCode.ERROR;
    }

    public ServiceException(Throwable cause) {
        super(cause);
        this.code = ResultCode.ERROR;
    }

    public int getCode() {
        return this.code;
    }

    public void setCode(int code) {
        this.code = code;
    }
}
public interface BaseExceptionMsg {
    int getExpCode();

    String getExpMsg();
}

3.定义各个系统异常。

public enum DmaServiceExcetionMsg implements BaseExceptionMsg {

    QUERY_NODATA(20000,"查询无数据"),

    TOKENEXCEPTION(20001,"Token无效或Token已失效"),

    NOT_NULL(20002,"为必填字段"),

    TO_LONG(20003,"字段太长");

    private int code;
    private String msg;

    DmaServiceExcetionMsg(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    @Override
    public int getExpCode() {
        return this.getCode();
    }

    @Override
    public String getExpMsg() {
        return this.getMsg();
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值