SpringBoot开发中实现对前端返回数据的一致及错误异常统一处理

SpringBoot开发中实现对前端返回数据的一致及错误异常统一处理

我们要做的事向前端返回的统一的json格式的数据,在这里定义一个通用的返回类

//统一返回
public class CommonReturnType {

    //表名请求的返回处理结果 success或者fail
    private String status;

    //若status=success,则返回前端json数据
    //若status=fail,则返回前端通用错误码
    private Object data;

    //定义一个通用的创建方法
    public static CommonReturnType create(Object result){
        return CommonReturnType.create(result,"success");
    }

    public static CommonReturnType create(Object result, String status) {
        CommonReturnType type=new CommonReturnType();
        type.setStatus(status);
        type.setData(result);
        return type;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Object getData() {
        return data;
    }

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

}

格式为 status + data
在成功的时候直接调用这个类返回
在这里我们在controller层进行了处理


@Controller("user")
@RequestMapping("/user")
public class UserController extends BaseController{


    @Autowired
    private UserService userService;

    @RequestMapping("/get")
    @ResponseBody
    public CommonReturnType getUser(@RequestParam(name="id") Integer id) throws BusinessException {

        //调用service服务获取用户的对象返回给前端
        UserModel userModel = userService.getUserById(id);

        //若获取的对应用户信息不存在
        if(userModel==null){
            throw new BusinessException(EmBusinessError.USER_NOT_EXIST); //抛异常
        }
//        //将核心领域模型转化为UI使用的Object
//        return convertFromModek(userModel);
        UserVO userVO = convertFromModek(userModel);
        //返回通用对象
        return CommonReturnType.create(userVO);  
    }

    private UserVO convertFromModek(UserModel userModel){
        if(userModel==null){
            return null;
        }
        UserVO userVO=new UserVO();
        BeanUtils.copyProperties(userModel,userVO);
        return userVO;
    }
}

在这里当获取数据成功的时候就返回成功的状态加上成功获取的数据
但在失败的时候我们也需要将错误的信息传给用户,而不是直接显示服务器向页面返回的错误信息

先定义个相关的接口

public interface CommonError {
    public int getErrCode();
    public String getErrMsg();
    public CommonError setErrMsg(String errMsg);
}

在这里我们要创建一个用于挪列所有错误的枚举类

public enum EmBusinessError implements CommonError {
    //通用错误类型00001
    PARAMETER_VALIDATION_ERROR(10001,"参数不合法"),
    UNKNOWN_ERROR(10002,"未知错误"),
    //10000开头为为用户信息相关的错误定义
    USER_NOT_EXIST(20001,"用户不存在")

    ;

    private int errCode;
    private String errMsg;

    EmBusinessError(int errCode, String errMsg) {
        this.errCode=errCode;
        this.errMsg=errMsg;
    }

    @Override
    public int getErrCode() {
        return errCode;
    }

    @Override
    public String getErrMsg() {
        return errMsg;
    }

    @Override
    public CommonError setErrMsg(String errMsg) {
        this.errMsg=errMsg;
        return this;
    }
}

在定义相关的一异常类,在抛异常的时候我们要用到这个异常类

public class BusinessException extends Exception implements CommonError{

    private CommonError commonError;

    //接收EmBussinessError的传参用于构造业务异常
    public BusinessException(CommonError commonError){
        super();
        this.commonError=commonError;
    }


    //接收errMsg的方式构造业务异常
    public BusinessException(CommonError commonError,String errMsg){
        super();
        this.commonError=commonError;
        this.commonError.setErrMsg(errMsg);
    }


    @Override
    public int getErrCode() {
        return commonError.getErrCode();
    }

    @Override
    public String getErrMsg() {
        return commonError.getErrMsg();
    }

    @Override
    public CommonError setErrMsg(String errMsg) {
        this.setErrMsg(errMsg);
        return this;
    }
}

我们刚才已经在Controller层定义了对获取到的用户进行检测,如果是空的话就跑一个异常,然后SpringBoot有专门的处理异常的程序
我们在这里来定义它,创建一个基类,到时候让所有的Controller层都继承他,也就默认把这个方法添加到控制器中了

mport com.miaoshaproject.error.BusinessException;
import com.miaoshaproject.error.EmBusinessError;
import com.miaoshaproject.response.CommonReturnType;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

public class BaseController {

    //定义excptionHandler解决违背controller层吸收的exception
    @ExceptionHandler(Exception.class) //指定,当出现Exception这个异常的时候就执行相关的代码
    @ResponseStatus(HttpStatus.OK)  //让他以正常的状态返回
    @ResponseBody
    public CommonReturnType handlerException(HttpServletRequest request, Exception ex){
        Map responseData = new HashMap<>();
        if(ex instanceof BusinessException) {
            BusinessException businessException = (BusinessException) ex;
            responseData.put("errCode", businessException.getErrCode());
            responseData.put("errMsg", businessException.getErrMsg());
            return CommonReturnType.create(responseData, "fail");
        }else {
            responseData.put("errCode",EmBusinessError.UNKNOWN_ERROR);
            responseData.put("errMsg", EmBusinessError.UNKNOWN_ERROR.getErrMsg());
            return CommonReturnType.create(responseData, "fail");
        }
    }
}

在这里我们对所有的错误都进行处理,保证返回给前端的信息时固定的格式的

在这总结一下

	//1.定义了一个CommonReturnType通用返回类( status + data )方式返回所有的json数据
    //2.定义了一个EmBusinessError类来管理所有的异常错误
    //3.定义了一个BaseController来处理在Controller层的所有异常

你可能感兴趣的:(SSM框架)