分组校验
场景:新增和修改的时候校验规则不同,给校验注解标注什么情况需要校验
创建两个空接口,UpdateGroup, AddGroup
/**
* 品牌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;
新增两个接口
/**
* 保存
*/
@RequestMapping("/save")
// @RequiresPermissions("product:brand:save")
public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand
// , BindingResult result
) {
// if (result.hasErrors()) {
// Map<String, String> map = new HashMap<>();
// //1. 获取校验的错误结果
// result.getFieldErrors().forEach((item) -> {
// //FiledError 获取到错误提示
// String message = item.getDefaultMessage();
// // 获取到错误名字
// String field = item.getField();
// map.put(field, message);
// });
// return R.error(400, "提交的数据不合法").put("data", map);
// } else {
// brandService.save(brand);
// }
brandService.save(brand);
return R.ok();
}
在controller上加上标注分组
测试
发现没有指定分组的校验是不起作用的
/**
* 保存
*/
@RequestMapping("/save")
// @RequiresPermissions("product:brand:save")
public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand
// , BindingResult result
) {
// if (result.hasErrors()) {
// Map<String, String> map = new HashMap<>();
// //1. 获取校验的错误结果
// result.getFieldErrors().forEach((item) -> {
// //FiledError 获取到错误提示
// String message = item.getDefaultMessage();
// // 获取到错误名字
// String field = item.getField();
// map.put(field, message);
// });
// return R.error(400, "提交的数据不合法").put("data", map);
// } else {
// brandService.save(brand);
// }
brandService.save(brand);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
// @RequiresPermissions("product:brand:update")
public R update(@Validated(UpdateGroup.class) @RequestBody BrandEntity brand) {
brandService.updateById(brand);
return R.ok();
}
想要生效,所有都需要加上校验组(不标注分组不起作用)
package com.zhouzhou.gulimall.product.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import com.zhouzhou.common.valid.AddGroup;
import com.zhouzhou.common.valid.UpdateGroup;
import lombok.Data;
import org.hibernate.validator.constraints.URL;
import javax.validation.constraints.*;
/**
* 品牌
*
* @author zhouzhou
* @email zds1529219484@gmail.com
* @date 2021-02-10 10:28:01
*/
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 品牌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;
/**
* 品牌logo地址
*/
@NotBlank(groups = {AddGroup.class})
@URL(message = "logo必须是一个合法的url地址", groups = {AddGroup.class, UpdateGroup.class})
private String logo;
/**
* 介绍
*/
private String descript;
/**
* 显示状态[0-不显示;1-显示]
*/
private Integer showStatus;
/**
* 检索首字母
*/
@NotEmpty(groups = {AddGroup.class})
@Pattern(regexp = "/^[a-zA-z]$/", message = "检索首字母必须是一个字母", groups = {AddGroup.class, UpdateGroup.class})
private String firstLetter;
/**
* 排序
*/
@NotNull(groups = {AddGroup.class})
@Min(value = 0, message = "排序必须大于等于0", groups = {AddGroup.class, UpdateGroup.class})
private Integer sort;
}
完整版如上
自定义校验注解
实现流程:1. 编写一个自定义的校验注解 2. 编写一个自定义的校验器 3.关联自定义的校验器和自定义的校验注解
这一个章节对于理解 自定义注解的使用很有效
添加 依赖 common 中
<!-- 校验 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
添加 自定义注解
/**
* 显示状态[0-不显示;1-显示]
*/
@ListValue(vals = {0, 1}, groups = {AddGroup.class})
private Integer showStatus;
创建自定义注解
@Documented
// 可以同时指定多个不同的校验器
@Constraint(
validatedBy = {ListValueConstraintValidator.class }
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
String message() default "{com.example.common.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] vals() default {};
}
添加 默认 message 消息描述文件
com.example.common.valid.ListValue.message=必须指定指定的值
TODO 这里乱码了
创建自定义规则
public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {
private Set<Integer> set = new HashSet<>();
// 初始化方法
@Override
public void initialize(ListValue constraintAnnotation) {
int[] vals = constraintAnnotation.vals();
for (int val : vals) {
set.add(val);
}
}
// 判断是否校验成功
/**
*
* @param integer 需要校验的值
* @param constraintValidatorContext
* @return
*/
@Override
public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
return set.contains(integer);
}
}