Spring Boot 构建电商基础秒杀项目 (三) 通用的返回对象 & 异常处理

时间:2024-12-10 18:38:08

SpringBoot构建电商基础秒杀项目 学习笔记

定义通用的返回对象

public class CommonReturnType {

    // success, fail
private String status; // status = success, data 内返回前端需要的 json数据
// status = fail, data 内使用通用的错误码格式
private Object data; public static CommonReturnType create(Object result){ return 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;
}
}

定义错误接口

public interface CommonError {

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

定义错误类型枚举

public enum EmBusinessError implements CommonError {

    // 通用错误类型 10001
PARAMETER_VALIDATION_ERROR(10001, "参数不合法"),
UNKNOWN_ERROR(10002, "未知错误"), // 20000 开头为用户信息相关错误定义
USER_NOT_EXIST(20001, "用户不存在"), ; private int errCode;
private String errMsg; private EmBusinessError(int errCode, String errMsg){
this.errCode = errCode;
this.errMsg = errMsg;
} @Override
public int getErrCode() {
return this.errCode;
} @Override
public String getErrMsg() {
return this.errMsg;
} @Override
public CommonError setErrMsg(String errMsg) {
this.errMsg = errMsg;
return this;
}
}

包装器业务异常类实现

// 包装器业务异常类实现
public class BusinessException extends Exception implements CommonError { private CommonError commonError; public BusinessException(CommonError commonError){
super();
this.commonError = commonError;
} public BusinessException(CommonError commonError, String errMsg){
super();
this.commonError = commonError;
this.commonError.setErrMsg(errMsg);
} @Override
public int getErrCode() {
return this.commonError.getErrCode();
} @Override
public String getErrMsg() {
return this.commonError.getErrMsg();
} @Override
public CommonError setErrMsg(String errMsg) {
this.commonError.setErrMsg(errMsg);
return this;
}
}

定义 BaseController 处理异常

public class BaseController {

    // 定义 exceptionhandler 解决未被 controller 层吸收的 exception
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Object handlerException(HttpServletRequest request, Exception ex){ Map<String, Object> responseData = new HashMap<>(); if(ex instanceof BusinessException){
BusinessException businessException = (BusinessException)ex;
responseData.put("errCode", businessException.getErrCode());
responseData.put("errMsg", businessException.getErrMsg());
}else{
responseData.put("errCode", EmBusinessError.UNKNOWN_ERROR.getErrCode());
responseData.put("errMsg", EmBusinessError.UNKNOWN_ERROR.getErrMsg());
} return CommonReturnType.create(responseData, "fail");
}
}

修改 UserController

@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{
UserModel userModel = userService.getUserById(id); if(userModel == null){
// userModel.setEncrptPassword("123");
throw new BusinessException(EmBusinessError.USER_NOT_EXIST);
} UserVO userVO = convertFromModel(userModel); return CommonReturnType.create(userVO);
} private UserVO convertFromModel(UserModel userModel){
if(userModel == null){
return null;
} UserVO userVO = new UserVO();
BeanUtils.copyProperties(userModel, userVO); return userVO;
}
}

源码:spring-boot-seckill