1.校验分组
在gulimall-common项目中新建valid包
1.1.新增校验分组
package com.atguigu.common.valid;
/**
* JR303新增校验分组
*/
public interface AddGroup {
}
1.2.修改校验分组
package com.atguigu.common.valid;
/**
* JR303修改校验分组
*/
public interface UpdateGroup {
}
2.校验字段标注具体分组校验
package com.atguigu.gulimall.product.entity;
import com.atguigu.common.valid.AddGroup;
import com.atguigu.common.valid.UpdateGroup;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
import org.hibernate.validator.constraints.URL;
import javax.validation.constraints.*;
/**
* 品牌
* @author zfh
* @email hst1406959716@163.com
* @date 2021-10-14 09:40:46
*/
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 品牌id
*/
@Null(message = "新增不能指定品牌id", groups = {AddGroup.class})
@NotNull(message = "修改必须指定品牌id", groups = {UpdateGroup.class})
@TableId
private Long brandId;
/**
* 品牌名
*/
@NotBlank(message = "品牌名不能为空",groups = {AddGroup.class,UpdateGroup.class})
private String name;
/**
* 品牌logo地址
*/
@NotBlank(groups = {AddGroup.class})
@URL(message = "logo必须是1个合法的URL",groups = {AddGroup.class,UpdateGroup.class})
private String logo;
/**
* 介绍
*/
private String descript;
/**
* 显示状态[0-不显示;1-显示]
*/
@NotNull(groups = {AddGroup.class})
//@StatusListValue(vals={0,1},groups = {AddGroup.class, UpdateStatusGroup.class})
private Integer showStatus;
/**
* 检索首字母
*/
@NotEmpty(groups = {AddGroup.class})
@Pattern(regexp="^[a-zA-Z]$",message = "检索首字母必须是a-z或A-Z的一个字母",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;
}
3.controller中指明使用的校验分组
默认没有指定分组的校验注解在分组校验中不生效
/**
* 保存(指明使用新增校验分组)
* 默认没有指定分组的校验注解在分组校验中不生效
* @param brand
* @return
*/
@RequestMapping("/save")
public R save(@Validated(AddGroup.class) @RequestBody BrandEntity brand ){
brandService.save(brand);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@Validated(UpdateGroup.class) @RequestBody BrandEntity brand){
brandService.updateById(brand);
return R.ok();
}
4.postman测试
5.自定义校验注解
5.1.编写自定义校验注解
5.1.1.在gulimall-common项目pom文件中引入校验依赖
<!--校验-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
5.1.2.在resource中创建校验信息配置文件ValidationMessages.properties
com.atguigu.common.valid.StatusListValue.message=状态必须为指定的值(0-不显示;1-显示)
5.1.3.在gulimall-common项目的valid包下创建自定的状态校验注解StatusListValue
package com.atguigu.common.valid;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 自定义的状态校验注解
*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//validatedBy自定义注解与自定义校验器关联
@Constraint(validatedBy = {StatusListValueConstraintValidator.class})
public @interface StatusListValue {
String message() default "{com.atguigu.common.valid.StatusListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] vals() default {};
}
5.2.编写自定义校验器
package com.atguigu.common.valid;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
/**
* @description: 自定义的状态校验器
* @author: zfh
* @email: hst1406959716@163.com
* @date: Created in 2020/9/22 7:24
* @modified By:
* @version: 1.0
*/
public class StatusListValueConstraintValidator implements ConstraintValidator<StatusListValue,Integer> {
private Set<Integer> set = new HashSet<>();
//初始化
@Override
public void initialize(StatusListValue constraintAnnotation) {
int[] vals = constraintAnnotation.vals();
if(vals.length > 0){
for (int v:vals) {
set.add(v);
}
}
}
/**
* 判断是否校验成功
* @param value 需要校验的值
* @param constraintValidatorContext
* @return
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
return set.contains(value);
}
}
5.3.关联自定义校验器与自定义校验注解
在自定义校验注解StatusListValue上加Constraint指定校验器
//validatedBy自定义注解与自定义校验器关联
@Constraint(validatedBy = {StatusListValueConstraintValidator.class})
6.测试
6.1.修改状态校验分组
在valid包下新建修改状态校验分组UpdateStatusGroup
package com.atguigu.common.valid;
/**
* 修改状态校验分组
*/
public interface UpdateStatusGroup {
}
6.2.使用自定义校验注解
/**
* 显示状态[0-不显示;1-显示]
*/
@NotNull(groups = {AddGroup.class, UpdateStatusGroup.class})
@StatusListValue(vals={0,1},groups = {AddGroup.class, UpdateStatusGroup.class})
private Integer showStatus;
重启项目