自定义规则注解

除了使用已定义的校验规则外,我们也可以根据自定的业务自定义校验规则,接下来我们介绍一下如何自定义 Hibernate Validator校验规则。

创建自定义规则无参数注解介绍

声明自定义注解需要我们

  1. 先创建自定义注解。
  2. 在自定义注解类上声明@Constraint元注解。
  3. 在@Constraint的属性validatedBy 中指定自定义逻辑处理类的class对象。
  4. 在自定义逻辑处理类中定义校验规则。

1 创建自定义规则的注解

我们这里通过添加用户地区校验逻辑来进行讲解,如果用户是天津 北京 河北的用户就支持其进行用户的新增否则则不支持。

首先我们先创建名称为Addr的注解 具体代码如下:

@Target({ ElementType.FIELD})//修饰的范围是成员变量
@Retention(RetentionPolicy.RUNTIME)//该注解被保留的时间长短 RUNTIME:在运行时有效
@Constraint(validatedBy = MyAddrValidator.class)//指定校验逻辑处理的Class
public @interface Addr {String message() default "不支持该地区!";Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };
}
  • @Target 是注解的元注解 表示修饰的范围 @Target({ ElementType.FIELD}) 表示修饰的是成员变量
  • @Retention 是注解的元注解 表示注解被保留的时间长短
  • @Retention(RetentionPolicy.RUNTIME) 表示在运行时有效
  • @Constraint: Hibernate Validator 定义元注解 指定处理校验规则的类
  • String message(): 必须有的注解属性字段,该字段是用来定义不符合规则错误信息提示用的。

下面2行代码是自定义规则注解必须要添加的代码:

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

2 在自定义逻辑处理类中定义校验规则逻辑

  1. 自定义逻辑处理类 需要实现 ConstraintValidator接口
  2. 重写 ConstraintValidator接口 的**isValid **方法来完成校验规则的处理。

具体代码如下:


public class MyAddrValidator  implements ConstraintValidator<Addr, String>{String[] addrArray = new String[]{"北京","河北","天津"};@Overridepublic void initialize(Addr addr) {//启动时执行}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {for (String addrStr : addrArray) {if(addrStr.equals(value)) {return true;}}return false;}}

测试自定义规则无参数注解

User类中新增addr成员变量 然后将我们自定义规则注解声明在该字段上

public class User {@Addr(message="我们仅支持北京河北天津的用户!")private String addr;
}

通过调用addUser 方法来进行测试:



创建自定义规则有参数注解

还是上面的案例 你有么有发现我们将地区写死到了自定义注解类中,如果我们新增的话还需要修改自定义注解类,下面我们将地区通过注解的参数进行传入方式来限定用户的地区。

具体操作步骤如下:

  1. 通过@Constraint元注解的validatedBy 属性指定我们 自定义逻辑处理内部类 Class对象(这个类在自定义注解中)
  2. 自定义逻辑处理内部类 通过实现ConstraintValidato 接口重写initialize方法来获取到自定义注解中的值。
  3. 自定义逻辑处理内部类 重写 isValid 方法完成校验逻辑处理。

具体代码如下:
在自定义注解上声明 自定义逻辑处理内部类 的Class对象

@Constraint(validatedBy = AddrWithParam.Validator.class)
public @interface AddrWithParam {}

通过实现initialize 方法来接收自定注解传入参数的值。

public @interface AddrWithParam {public class Validator implements ConstraintValidator<AddrWithParam, String> {String[] valueArray;@Overridepublic void initialize(AddrWithParam addrWithParam){valueArray = addrWithParam.value();}}
}

具体代码如下:

@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = AddrWithParam.Validator.class)
public @interface AddrWithParam {String[] value();String message() default "不支持该地区!";Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };public class Validator implements ConstraintValidator<AddrWithParam, String> {String[] valueArray;@Overridepublic void initialize(AddrWithParam addrWithParam){valueArray = addrWithParam.value();}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {for (String addrStr : valueArray) {if(addrStr.equals(value)) {return true;}}return false;}}
}

自定义规则有参数注解测试

首先我们先再addr成员变量上声明AddrWithParam 注解 代码如下:

public class User {....@AddrWithParam(value = { "北京","河北","天津" })private String addr;
}




创建自定义规则枚举参数注解

像上面河北 天津这样的数据是一般是不会有变化的,我们可以将他们定义成枚举,通过将枚举的值传入自定义规则注解中来进行判断。

和上面自定义规则带参数注解处理方式是一样的,不相同的地方就是我们的注解参数由原来的string数组变成了枚举。示例代码如下:这里为了方便我们就将枚举定义在了注解的内部了。

@Constraint(validatedBy = AddrWithEnum.Validator.class)
public @interface AddrWithEnum {public enum AddrEnum{ HEBEI,BEIJING,TIANJING};AddrEnum addr() default AddrEnum.BEIJING;public class Validator implements ConstraintValidator<AddrWithEnum, String> {.....}
}

具体的代码如下:

@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = AddrWithEnum.Validator.class)
public @interface AddrWithEnum {public enum AddrEnum{ HEBEI,BEIJING,TIANJING};AddrEnum addr() default AddrEnum.BEIJING;String message() default "不支持该地区!";Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };public class Validator implements ConstraintValidator<AddrWithEnum, String> {AddrEnum addrEnum;@Overridepublic void initialize(AddrWithEnum addrWithEnum){addrEnum = addrWithEnum.addr();}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {System.out.println(value.equals(addrEnum.toString()));System.out.println(addrEnum.toString());System.out.println(value);if(value.equals(addrEnum.toString())) {return true;}return false;}}
}

进行测试:
首先我们先再addr成员变量上声明@AddrWithEnum注解 代码如下:

public class User {@AddrWithEnum(addr = AddrEnum.BEIJING)private String addr;
}

自定义规则枚举参数注解测试



我们可以通过官网地址 查看具体使用教程

另外也可以关注一下 我的GitHub项目: springbootexamples 进行学习

自定义Hibernate Validator规则注解相关推荐

  1. SpringMVC集成Hibernate Validator进行注解式的参数校验——让代码更少、更加专注于业务逻辑

    SpringMVC集成Hibernate Validator进行注解式的参数校验 --让代码更少.更加专注于业务逻辑 1 问题背景: 参数验证是一个常见的问题,例如验证用户输入的密码是否为空.邮箱是否 ...

  2. Spring Validation(使用Hibernate Validator)

    1.需要的jar包 hibernate-validator.5.1.3.Final.jar validation-api.1.1.0.Final.jar 2.springsevlet-config.x ...

  3. Springboot2参数校验: Hibernate Validator自定义注解

    1.Hibernate Validator介绍 Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constrain ...

  4. 自定义hibernate validation注解

    效果和优点 先看最后效果: public class UserEntity {@Password private String password;@Emailprivate String email; ...

  5. springboot中hibernate validator校验模式,分组校验,自定义校验

    检验模式 上面例子中一次性返回了所有验证不通过的集合,通常按顺序验证到第一个字段不符合验证要求时,就可以直接拒绝请求了.Hibernate Validator有以下两种验证模式: 普通模式(默认是这个 ...

  6. Hibernate Validator 后台数据规则校验拓展

    目录 1.dto 1-1.UserInfo 2.rules 2-1.after 2-1-1.UserInfoAfterRuleValid.java 2-2.before 2-2-1.UserInfoB ...

  7. Hibernate Validator用法

    2019独角兽企业重金招聘Python工程师标准>>> 一.Hibernate ValiDator介绍 Bean Validation是JSR303的定义,Hibernate Val ...

  8. Springmvc的服务端数据验证-----Hibernate Validator

    导入Hibernate validator的Jar包 hibernate-validator-4.3.0.Final.jar jboss-logging-3.1.0.CR2.jar validatio ...

  9. Hibernate Validator 6.0.13 声明和验证方法约束(Declaring and validating method constraints)

    播放地址 13.解读Hibernate-Validator官方文档- 方法参数校验API http://v.youku.com/v_show/id_XMzk1Njg2Njg5Mg==.html 3. ...

最新文章

  1. java并发处理时mvel表达式处理慢,一文说清!
  2. U-net实现医学图像分割
  3. 笔记整理-信息系统开发基础-面向对象分析与设计-面向对象设计的基本任务
  4. leetcode 1044. Longest Duplicate Substring | 1044. 最长重复子串(Rabin Karp算法)
  5. JDK 7的算法和数据结构
  6. 做简单的android 软件推荐,Android_适用于Android开发的简单聊天软件,适用于android 开发。是一个简 - phpStudy...
  7. 电脑硬件检测_【学无止境】电脑硬件维修测试学习资料(附送各类PC检修资源)...
  8. 叮咚买菜的数据应用之路,互联网公司的数据决策平台有何不同
  9. Microsoft Office SharePoint Server 2007介绍
  10. d语言 c++ 混合编程,C++,D语言,Python语言一次模拟合作开发
  11. Android已有的原生Camera框架中加入自己的API的实现方案。
  12. ASP.NET实现文件上传和下载
  13. 面向对象的程序设计-地铁路线计算程序的设计、优化与测试
  14. 手机淘宝APP怎么复制商品链接发送到微信公众号查询淘宝优惠券及淘宝返利?
  15. --legacy-peer-deps 作用
  16. RAID磁盘阵列与阵列卡 2022.6.5
  17. android电视,手机控制,Android手机遥控电视:智能语音控制节目
  18. linux安装英伟达显卡驱动
  19. 网易上线短视频创作平台“网易知识公路“
  20. CentOS_anydesk

热门文章

  1. cups支持的打印机列表_lpadmin-配置CUPS套件中的打印机和类
  2. jsp 如何动态给图片赋值_在Excel表格中你知道如何动态引用图片吗?
  3. list选取多个元素 python_python基础篇:list列表的操作大盘点
  4. 使用Addressable更好的管理内存
  5. VS Code 1.38 发布,官方图标存储库发布
  6. MySqlBackup.NET——用于C#,VB.NET,ASP.NET的MySQL备份解决方案
  7. odoo10参考系列--视图一(列表视图)
  8. java跨库调用存储_java-调用spring数据其余存储库方法不会返回...
  9. scss 变量_SCSS和Sass使用这种样式语言所需的所有CSS和SCSS代码
  10. c语言几千行代码图片,【图片】发几个C语言课程设计源代码(恭喜自己当上技术小吧主)【东华理工大学吧】_百度贴吧...