模仿valid实现自定义校验器
实际项目中遇到需要自定义校验的属性
1.实现ConstraintValidator自定义的校验器
package pyf.smilemall.common.valid;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
/**
* @author pengyifeng
* @version 2.0
* @ClassName ListValueConstraintValidator.java
* @Description 自定义的校验器
* @createTime 2021年09月01日 16:51:00
*/
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
private Set<Integer> vals=new HashSet<>();
/**
* 校验器初始化
* @param constraintAnnotation
*/
@Override
public void initialize(ListValue constraintAnnotation) {
//获取注解的中制定的值
int[] value = constraintAnnotation.value();
if(ArrayUtil.isNotEmpty(value)){
for (int i : value) {
vals.add(i);
}
}
}
@Override
public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
//判断传入值是否符合注解中要求的值
return vals.contains(constraintValidatorContext);
}
}
需要实现ConstraintValidator
2.新增自定注解
package pyf.smilemall.common.valid;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* @author pengyifeng
* @version 2.0
* @ClassName ListValue.java ListValueConstraintValidator是你自定义自定义校验器
* @Description 自定义注解
* @createTime 2021年09月01日 16:50:00
*/
@Documented
@Constraint(validatedBy = {ListValueConstraintValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
String message() default "{pyf.smilemall.common.valid.ListValue.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
int[] value() default {};
}
3.需要的属性上新增该注解
package pyf.smilemall.product.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import pyf.smilemall.common.valid.AddGroup;
import pyf.smilemall.common.valid.ListValue;
import pyf.smilemall.common.valid.UpdateGroup;
import pyf.smilemall.common.valid.UpdateStatusGroup;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
/**
* 品牌
*
* @author pyf
* @email pyf1653@163.com
* @date 2021-07-28 11:58:22
*/
@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 id;
/**
* 品牌名
*/
@NotBlank(message = "品牌名不能为空")
private String name;
/**
* 品牌logo
*/
private String logo;
/**
* 显示状态[0-不显示;1-显示] @ListValue为自定义注解
*/
@ListValue(value = {0,1},message = "显示状态不属于规定值",groups = {UpdateStatusGroup.class})
private Integer status;
/**
* 检索首字母
*/
private String firstLetter;
/**
* 排序
*/
private Integer sort;
/**
* 备注
*/
private String remark;
}
4.接口新增分组
/**
* 修改status
*/
@RequestMapping("/update/status")
// @RequiresPermissions("product:brand:update")
public R updateStatus(@Validated({UpdateStatusGroup.class})@RequestBody BrandEntity brand){
brandService.updateById(brand);
return R.ok();
}