模仿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();
    }
posted @ 2021-09-01 18:31  Java程序位移师  阅读(320)  评论(0)    收藏  举报