在用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异常类来