目录
一:JSR303_基本校验方法:
1)给 Bean 添加校验注解:并定义自己的 message。
a:区分不为空:
@NotEmpty::用在集合类上面,不能为null,并且长度必须大于0
@NotBlank:: 用在String上面,只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@NotNull ::用在基本类型上,不能为null,但可以为空字符串
/**
* 商品三级分类
*
* @author zhangxudong
* @email 498798398@gmail.com
* @date 2021-02-18 16:07:34
*/
@Data
@TableName("pms_category")
public class CategoryEntity implements Serializable {
@NotEmpty
@NotBlank(message = "商品名称不能为空")
@NotNull
@Email(message = "必须为 一个 合法的 Email")
@URL(message = "必须为一个 合法的 URL 地址")
@Min(value = 1, message = "最小为 1")
/**
* 分类名称
*/
@NotBlank(message = "分类名称 不可为空")
private String name;
/**
* 父分类id
*/
@NotNull(message = "父分类 id 不可为空")
private Long parentCid;
/**
* 层级
*/
@NotNull(message = "层级 不可为空")
private Integer catLevel;
/**
* 保存此菜单 所有子分类
*/
@NotEmpty
private List<CategoryEntity> children;
}
2)自定义校验规则:(正则表达式)
/**
* 检索首字母(必须为字母开头)
*/
@Pattern(regexp = "/^[a-zA-Z]$/")
private String firstLetter;
3)开启校验功能 @Valid:效果:校验错误以后会有,默认相应值。
@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand, BindingResult result) {}
4)校验出错,处理异常,返回异常提示(在类里处理)(BindingResult)
/**
* 保存
*/
@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand, BindingResult result) {
if (result.hasErrors()) {
HashMap<String, String> hashMap = new HashMap<>();
result.getFieldErrors().forEach(fieldError -> {
String field = fieldError.getField();
String defaultMessage = fieldError.getDefaultMessage();
hashMap.put(field, defaultMessage);
}
);
return R.error(400, "提交数据不合法").put("data", hashMap);
}
System.out.printf("brand" + brand);
brandService.save(brand);
return R.ok();
}
二:JSR303_校验后统一异常处理:
1)错误代码:五位数字。10:通用,001:参数格式校验,11:商品,12:订单:13:购物车,14:物流
2)全局返回数据的枚举类型:
/**
* @Author zhangsan
* @Date 2021/3/14 3:36 下午
* @Version 1.0
*/
public enum BizCodeEnum {
NKNOW_EXCEPTION(10000, "系统未知异常"),
VAILD_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;
}
}
3)全局异常处理(数据绑定异常)
/**
* @Author zhangsan
* @Date 2021/3/14 3:16 下午
* @Version 1.0
*/
@Slf4j
@RestControllerAdvice
public class GuliMailExceptionControllerAdvice {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handleValidException(MethodArgumentNotValidException exception) {
log.info("数据校验出现问题,异常类型" + exception.getClass(), exception.getMessage());
HashMap<String, String> hashMap = new HashMap<>();
BindingResult result = exception.getBindingResult();
result.getFieldErrors().forEach(fieldError -> {
String field = fieldError.getField();
String defaultMessage = fieldError.getDefaultMessage();
hashMap.put(field, defaultMessage);
}
);
return R.error(BizCodeEnum.VAILD_EXCEPTION.getCode(), BizCodeEnum.VAILD_EXCEPTION.getMsg())
.put("data", hashMap);
}
/**
* 全局异常处理方法
*/
@ExceptionHandler(Throwable.class)
public R handleException(Throwable throwable) {
return R.error(BizCodeEnum.NKNOW_EXCEPTION.getCode(), BizCodeEnum.NKNOW_EXCEPTION.getMsg());
}
}
三:JSR303_分组校验:
1)(没加分组的校验字段,在分组情况下是不生效,只会在 @Validated 下生效,@Validated 比 @Valid 能够多完成 多种场景下复杂校验)
2)编写 校验分组标识性接口(common 类中):
public interface AddGroup {
}
public interface UpdateGroup {
}
3)给 Bean 实体类中,加上 校验分组。
/**
* 品牌id
*/
@NotNull(message = "修改商品 id 不可为空", groups = {UpdateGroup.class})
@Null(message = "新增商品 id 必须为空", groups = {AddGroup.class})
@TableId
private Long brandId;
/**
* 品牌名
*/
@NotBlank(message = "商品名称不能为空",
groups = {AddGroup.class, UpdateGroup.class})
private String name;
4)新增 不能为空且必须为 URL 地址 // 修改时 可为空,但必须为 URL 地址。
/**
* 品牌logo地址
*/
@NotBlank(message = "新增 logo 不能为空", groups = {AddGroup.class})
@URL(message = "Logo 必须为 合法的 URL 地址",
groups = {AddGroup.class, UpdateGroup.class})
private String logo;
5)在 Controller 层,指定分组。( @Valid -> @Validated )
/**
* 保存
*/
@RequestMapping("/save")
public R save(@Validated(value = {AddGroup.class})
@RequestBody BrandEntity brand) {
brandService.save(brand);
return R.ok();
}
四:JSR303_自定义校验注解:(参照别的校验注解)
1)编写一个 自定义的 校验注解。
2)编写一个 自定义的 校验器。
3)关联 自定义的校验器 和 自定义的校验注解。
4)例:ListValue(Vals={0,1},message="此字段 只能传入 1 或 0")