✅P69_品牌管理-JSR303自定义校验注解

gong_yz大约 2 分钟谷粒商城

自定义校验注解

cfmall-common/pom.xml导入自定义校验需要的依赖

<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
  <version>2.0.1.Final</version>
</dependency>

自定义注解首先要满足JSR303的规范,即要有message、groups、Payload三个属性。参考@NotNull注解

package com.gyz.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;

@Documented
@Constraint(validatedBy = {ListValueConstraintValidator.class})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface ListValue {

    String message() default "{com.gyz.common.valid.ListValue.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    int[] vals() default { };

}


校验信息提示配置文件

cfmall-common 模块 resources 文件下新建 ValidationMessages.properties

com.gyz.common.valid.ListValue.message=必须提交指定的值

自定义校验器 ConstraintValidator

自定义校验器要实现ConstraintValidator接口,接口中的两个泛型分别指:需要校验的注解注解需要校验的数据类型

package com.gyz.common.valid;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;

/**
 * @Description
 * @Author GongYuZhuo
 * @Version 1.0.0
 */
public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {

    private final Set<Integer> set = new HashSet<>();

    /**
     * 初始化方法
     * 参数:自定义注解的详细信息
     */
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] values = constraintAnnotation.vals();
        for (int val : values) {
            set.add(val);
        }

    }

    /**
     * 判断是否校验成功
     *
     * @param value   需要校验的值
     * @param context
     * @return
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        return set.contains(value);
    }

}

接口定义了两个方法,一个是初始化方法,一个是校验方法 。

  • 初始化方法的参数是一个ListValue注解的对象也就可以获取对象的属性;
  • 校验方法的第一个参数就是传递进来需要校验的数据

关联自定义校验器和自定义校验注解

关联自定义校验器

关联自定义注解 cfmall-product/src/main/java/com/gyz/cfmall/product/entity/BrandEntity.java

 @NotNull(groups = {AddGroup.class, UpdateStatusGroup.class})
 @ListValue(vals = {0, 1}, groups = {AddGroup.class, UpdateStatusGroup.class})
 private Integer showStatus;

乱码解决

测试过程中发现乱码提示信息解决方法:

先将ValidationMessages.properties文件删除,取消提示默认勾选,设置如下

设置成功后再次创建文件,并对 common工程和product工程 进行maven的clean、install操作,保证设置更新成功。