前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java Bean Validation自定义注解

Java Bean Validation自定义注解

作者头像
十毛
发布2019-05-14 16:27:13
2.7K0
发布2019-05-14 16:27:13
举报
文章被收录于专栏:用户1337634的专栏

前面介绍了Java Bean Validation的使用,本文进一步介绍一下当标准的校验注解不满足要求时,可以自定义校验注解满足特定需求。比如@In,要求参数数据某个固定的集合(类似于枚举值)

自定义注解

  • @In
代码语言:javascript
复制
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Constraint(validatedBy = InValidator.class)
@Target({java.lang.annotation.ElementType.FIELD})
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Documented
public @interface In {
    //提示信息,可以写死,可以填写国际化的key
    String message() default "";

    int[] values() default {};

    //下面这两个属性必须添加
    Class<?>[] groups() default {};

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

注解实现类

  • InValidator
代码语言:javascript
复制
public class InValidator implements ConstraintValidator<In, Integer> {
    private final Set<Integer> values = new HashSet<>();
    private String msg = null;
    @Override
    public void initialize(In constraintAnnotation) {
        for (int value : constraintAnnotation.values()) {
            this.values.add(value);
        }
        String msg = values.stream().map(Object::toString).collect(Collectors.joining(",", "[", "]"));
        this.msg = String.format("只能取值%s", msg);
    }

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
        boolean contains = values.contains(value);
        if (contains) {
            return true;
        }

        if (context.getDefaultConstraintMessageTemplate().isEmpty()) {
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate(this.msg).addConstraintViolation();
        }
        return false;
    }
}

使用

  • Person.java
代码语言:javascript
复制
@Data
public class Person {
    @Null(message = "id should be empty")
    private Integer id;

    @Length(min = 2, max = 10, message = "name的长度为[2-10]之间")
    @NotBlank(message = "name should not be empty")
    private String name;

    @Min(18)
    @Max(130)
    private Integer age;

    @NotNull(message = "gender should not be empty")
    private Boolean gender;

    @Null(message = "createTime should be empty")
    private LocalDateTime createTime;

    @Null(message = "updateTime should be empty")
    private LocalDateTime updateTime;

    //这里是自定义注解,指定type只能是1或2
    @In(values = {1,2})
    private Integer type;
}

测试

  • 参数
代码语言:javascript
复制
{
    "name": "tenmao",
    "gender": true,
    "type": 3
}
  • 结果
代码语言:javascript
复制
{
    "code": 400,
    "msg": "[只能取值[1,2]]",
    "data": null
}

常见问题

  • 自定义注解需要配置@Constraint(validatedBy = InValidator.class),但是查看内置的注解,比如@NotNull中的却是空的validatedBy = {}。这是因为API中并不包含实现类,这样就需要实现类实现手动配置,比如hibernate-validator是在ConstraintHelper.java完成的

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.05.05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自定义注解
  • 注解实现类
  • 使用
  • 测试
  • 常见问题
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档