真实场景:校验号码是否已经被注册,假如号码已经被注册
分析步骤:
1、判断号码是否被注册,被注册,走第二步
2、抛出异常
3、全局异常类捕获异常
4、返回处理结果
必知:
1、工具类:AssertUtil 、ResultInfoUtil(ResultInfo 的工具类)
2、ResultInfo —— vo类
service层
//校验手机号是否已注册
public void checkPhoneIsRegistered(String phone){
//校验号码是否为空
AssertUtil.isNotEmpty(phone, "手机号不能为空");
//号码与数据库数据比对
Dinner dinner = dinersMapper.checkPhoneIsRegistered(phone);
//重复
AssertUtil.isTrue(dinner, "号码未注册")
}
工具类
public class AssertUtil {
// 判断字符串非空
public static void isNotEmpty(String str, String... message) {
if (StrUtil.isBlank(str)) {
execute(message);
}
}
// 判断结果是否为真
public static void isTrue(boolean isTrue, String... message) {
if (isTrue) {
execute(message);
}
}
// 最终执行方法 --执行到这里说明由异常
private static void execute(String... message) {
String msg = ApiConstant.ERROR_MESSAGE;
//判断有无错误提示信息、有的话,就代替默认错误提示信息
if (message != null && message.length > 0) {
msg = message[0];
}
//抛出异常 —— 让全局异常类捕获该异常
throw new ParameterException(msg);//具体异常类,这里是参数异常类
}
}
/**
* 公共返回对象工具类
*/
public class ResultInfoUtil {
// 请求出错返回
public static <T> ResultInfo<T> buildError(int errorCode, String message) {
ResultInfo<T> resultInfo = build(errorCode, message, null);
return resultInfo;
}
// 构建返回对象方法
public static <T> ResultInfo<T> build(Integer code, String message, T data) {
if (code == null) {
code = ApiConstant.SUCCESS_CODE;
}
if (message == null) {
message = ApiConstant.SUCCESS_MESSAGE;
}
ResultInfo resultInfo = new ResultInfo();
resultInfo.setCode(code);
resultInfo.setMessage(message);
resultInfo.setData(data);
return resultInfo;
}
}
全局异常捕获类
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
//具体异常
@ExceptionHandler(ParameterException.class)
public ResultInfo<Map<String, String>> handlerParameterException(ParameterException ex){
//其实这里可以直接返回 resultInfo 信息,但是这里是全局异常处理类,按照单一责任原则,所以不建议在这返回 resultInfo 信息。
ResultInfo<Map<String, String>> resultInfo =
ResultInfoUtil.buildError(ex.getErrorCode(), ex.getMessage());
return resultInfo;
}
// 未知异常 —— 最大异常
@ExceptionHandler(Exception.class)
public ResultInfo<Map<String, String>> handlerException(Exception e){
//返回结果
}
}
参数异常类
/**
* 全局异常类 —— 参数异常
*/
@Getter
@Setter
public class ParameterException extends RuntimeException {
private Integer errorCode;
public ParameterException() {
super(ApiConstant.ERROR_MESSAGE);
this.errorCode = ApiConstant.ERROR_CODE;
}
public ParameterException(Integer errorCode) {
this.errorCode = errorCode;
}
public ParameterException(String message) {
super(message);
this.errorCode = ApiConstant.ERROR_CODE;
}
public ParameterException(Integer errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
}
ResultInfo 对象
/**
* 公共返回对象
*/
@Getter
@Setter
@ApiModel(value = "返回说明")
public class ResultInfo<T> implements Serializable {
@ApiModelProperty(value = "成功标识0=失败,1=成功")
private Integer code;
@ApiModelProperty(value = "描述信息")
private String message;
@ApiModelProperty(value = "访问路径")
private String path;
@ApiModelProperty(value = "返回数据对象")
private T data;
}```