Spring Boot 学习(五)

13

统一异常处理

统一返回数据的格式

创建一个Result类,用来作为返回值的类型

  • code 错误编码
  • msg 错误信息
  • data 返回数据,返回错误的话为null
public class Result<T> {

    //错误码
    private Integer code;

    //提示信息
    private String msg;

    //数据
    private T data;

    public Integer getCode() {
        return code;
    }

    public Result() {
    }

    public Result(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

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

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}

ResultUtil,工具类,用来简化代码

import cn.medemede.springbootdemo1.domain.Result;

public class ResultUtil {

    public static Result success(Object o){
        Result result=new Result();
        result.setCode(0);
        result.setMsg("success");
        result.setData(o);

        return result;
    }

    public static Result error(Integer code,String msg){
        Result result=new Result();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }
}

创建统一异常处理handle

此类会拦截所有系统抛出的异常,并封装成Result的格式

import cn.medemede.springbootdemo1.domain.Result;
import cn.medemede.springbootdemo1.exception.GirlException;
import cn.medemede.springbootdemo1.util.ResultUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 {

    private static Logger logger= LoggerFactory.getLogger(ExceptionHandle.class);

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

        if(e instanceof GirlException){
            return ResultUtil.error(((GirlException) e).getCode(),e.getMessage());
        }else {
            logger.error("【系统异常】:{}", e);
            return ResultUtil.error(-1, "系统错误");
        }
    }

}

创建自定义异常

  • 创建自定义的异常,添加code字段
  • 一定要继承RuntimeException而不是Exception
  • 这里有一个Enum参数的构造方法

import cn.medemede.springbootdemo1.enums.ResultEnum;

public class GirlException extends RuntimeException {

    private Integer code;

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

    public GirlException(ResultEnum resultEnum){
        super(resultEnum.getMessage());
        this.code=resultEnum.getCode();
    }

    public Integer getCode() {
        return code;
    }

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

}

创建异常枚举类

为了方便异常的管理和使用,用一个枚举类来定义所有异常

public enum ResultEnum {
    SUCCESS(0,"success"),
    UNKONW_ERROR(-1,"UNKONW ERROR"),
    PRIMARY_SCHOOL(100,"PRIMARY SCHOOL"),
    HIGH_SCHOOL(101,"HIGH SCHOOL"),
    ;

    private Integer code;
    private String message;

    ResultEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

单元测试

使用idea进行单元测试

使用idea可以发很难改变的可以方便的进行单元测试 只需要在需要进行测试的方法上右键->goto->test 然后就idea就可以自动生成单元测试类

在单元测试类上编著

@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MockMvcBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class GrilControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void girlList() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/girls")).andExpect(
                MockMvcResultMatchers.status().isOk());
    }

}