JSR303数字校验
简单校验
使用示例:
-
引入对应的校验依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
-
在需要校验的业务字段上添加相应的注解,如:
-
在需要校验的方法上(一般是controller方法)添加
@Valid
注解,在后面追加BindingResult
类,相当于错误结果都追加到这个类中
统一异常处理
使用示例:
-
定义特定错误的状态码,common模块中单独定义一个常量类,用来存储这些错误状态码
/***
* 错误码和错误信息定义类
* 1. 错误码定义规则为5为数字
* 2. 前两位表示业务场景,最后三位表示错误码。例如:100001。10:通用 001:系统未知异常
* 3. 维护错误码后需要维护错误描述,将他们定义为枚举形式
* 错误码列表:
* 10: 通用
* 001:参数格式校验
* 11: 商品
* 12: 订单
* 13: 购物车
* 14: 物流
*/
public enum BizCodeEnum {
UNKNOW_EXEPTION(10000,"系统未知异常"),
VALID_EXCEPTION( 10001,"参数格式校验失败");
private int code;
private String msg;
BizCodeEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
-
在product里面新建异常拦截类
GulimallExceptionControllerAdvice
,用来集中处理所有异常@ExceptionHandler
思考:这样可以做到单个模块的全局异常拦截,但是每一个模块都要单独定义一个感觉不优雅。
改进:可不可以在common模块定义一个所有模块能共用的,后面要用的话,直接在每一个controller类继承这个公共类即可。如:
public class BaseController
{
public static final Logger LOGGER = LoggerFactory.getLogger(BaseController.class);
/**
* 统一异常处理
* @param request
* @param response
* @param exception
*/
分组校验
使用示例:
-
在common中新建valid包,里面新建两个空接口
AddGroup
,UpdateGroup
用来分组
-
在需要分组校验的字段上标注分组,如:
-
校验方法上的
@Valid
注解换成@Validated
注解,并标记好分组
自定义校验
-
编写一个自定义注解接口,如:
-
编写一个自定义注解校验器,如
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
private Set<Integer> set=new HashSet<>();
-
关联检验接口与校验器
-
在需要的字段上进行添加