SpringBoot 统一异常处理

在用spring Boot做web后台时,经常会出现异常,如果每个异常都自己去处理很麻烦,所以我们创建一个全局异常处理类来统一处理异常

一,首先创建全局异常处理类:通过使用@ControllerAdvice定义统一的异常处理类,而不是在每个Controller中逐个定义。@ExceptionHandler用来定义函数针对的异常类型,@ResponseBody 统一回复格式为json

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class ExceptionHandle {

@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result handle(Exception e) {

}

}

这里的返回类型为Result 可以定义Result实体类来统一返回格式,主要是返回给我们前端的json数据格式
//统一回复格式
public class Result {
//错误码
private Integer code;
//提示信息
private String msg;
//具体的内容
private T data;
//省略getter和setter方法
}

这里创建一个处理ResultUtil来处理回复格式,包括发生异常的和未发生异常的
import com.oldbig.domain.Result;

public class ResultUtil {

public static Result success(Object object){
    Result result = new Result();
    result.setCode(0);
    result.setMsg("成功");
    result.setData(object);
    return result;
}

public static Result success(){
    return success(null);
}

//当发生异常时,根据code可判断异常的类型
//这里发生异常的error方法,未定义返回数据,默认为null
public static Result error(Integer code,String msg){
    Result result = new Result();
    result.setCode(code);
    result.setMsg(msg);
    return result;

}

}

创建一个自定义异常,用来实验捕获该异常
//spring只对runtimeException做回滚处理
public class GirlException extends RuntimeException{

private Integer code;

public GirlException(String msg,Integer code){
    super(msg);
    this.code = code;
}

public Integer getCode() {
    return code;
}

public void setCode(Integer code) {
    this.code = code;
}

}

这样我们的统一处理类为:
import com.oldbig.domain.Result;
import com.oldbig.exception.GirlException;
import com.oldbig.utils.ResultUtil;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class ExceptionHandle {

@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result handle(Exception e) {
    if (e instanceof GirlException) {
        GirlException girlException = (GirlException) e;
        return ResultUtil.error(girlException.getCode(), girlException.getMessage());
    } else {
        return ResultUtil.error(-1,"未知错误");
    }
}}

这样在我们的service中只要出现request不符合条件的都可以抛出异常,而符合条件的都返回

import com.oldbig.domain.Girl;
import com.oldbig.enums.ResultEnum;
import com.oldbig.exception.GirlException;
import com.oldbig.respository.GirlRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;

@Service
public class GirlService {
    @Autowired
    private GirlRepository girlRepository;

    //校验年龄,统一异常处理
    public Girl getAge(Integer id) throws Exception{
        Girl girl = girlRepository.findOne(id);
        Integer age = girl.getAge();
        if(age<10){
            throw new GirlException("你还在上小学吧",100);
        }else if(age < 16){
            throw new GirlException("你还在上中学吧",101);
        }    
         return ResultUtil.success(girl);
 }

这样,如果请求的女生年龄小于10或者16,就会抛出异常,并返回
{“code”:100,”msg”:”你可能还在上小学”,”data”:null}
{“code”:101,”msg”:”你可能在上初中”,”data”:null}
如果大于16,则返回
{“code”:0,”msg”:”成功”,”data”:{“id”:5,”cupSize”:”A”,”age”:18}}
统一的返回给前端的json格式,并且可以通过定义自己的Exception异常类来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值