专栏首页用户1337634的专栏Java Bean Validation自定义注解

Java Bean Validation自定义注解

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

自定义注解

  • @In
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
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
@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;
}

测试

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

常见问题

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

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Connection Reset异常

    十毛
  • Spring Boot With H2

    十毛
  • Arthas - Java诊断神器

    sc -d {className} 支持通配符,从code-source可以看出来类从哪个jar包加载的

    十毛
  • PC 端微信技术研究之保存聊天语言

    最近又学习了某位大佬用 CE 的方法,大佬的一句话有点醍醐灌顶,然后有了新的感觉,然后开始尝试实践这篇文章。

    信安之路
  • 如何购买腾讯云服务器

    官网购买地址热卖云产品3折起,云服务器、云数据库特惠,服务更稳,速度更快,价格更优【新用户限量秒杀】热门云产品限量秒杀,云服务器1核2G 16.5元/月起

    赤孺
  • 【新手教程】手把手教你搭建腾讯云服务器

        暑假期间,愁着无聊但也不能荒废学业吧,毕竟以后想靠技术混口饭吃!为了实施自己的计划,特地挑了一个便宜的云服务器来用作自己的后台;这不是学生狗没钱嘛,所以...

    赤孺
  • 水利RTU有效解决农村饮用水安全监测问题

    由于农村不合理使用农药化肥、垃圾随意排放,同时还有工业污染的废水废气有害物质通过降雨、直接沉降等多种方式也进入到饮用水源。使各种有害物质、农药及其他污染物通过地...

    用户7348788
  • static关键字,面试经常被问到!(一)

    static可以理解为全局的。 static可以修饰: 变量,方法,代码块,内部类。

    Mshu
  • 2016年下半年《软件评测师》下午试卷及答案

    一、阅读下列C程序,回答问题1至问题3,将解答填入答题纸的对应栏内。 【C程序】

    王大力测试进阶之路
  • Ubuntu14.04下安装Caffe

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    GavinZhou

扫码关注云+社区

领取腾讯云代金券