如何自定义hibernate validation注解示例代码
作者:目尽地平线 发布时间:2021-08-31 12:05:51
Bean Validation 中内置的 constraint
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
Hibernate Validator 附加的 constraint
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
效果和优点
先看最后效果:
public class UserEntity {
@Password
private String password;
private String email;
}
上面使用了两个自定义的注解来验证password和email,这样做的好处是:一处定义,处处使用,要修改验证规则时,也只要修改注解就可以了。而如果自定义,使用hibernate提供的标签的话:
@Pattern(regexp="...")
private String email;
如果写了很多个类之后,突然要修改验证规则regexp,此时工作量将要大得多。
实现
首先,引入hibernate validation依赖,添加:
<!-- hibernate validator -->
<!-- hibernate 验证框架 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.2.Final</version>
</dependency>
hibernate validation是JSR的参考实现,所以,用它做bean验证。
自定义一个验证注解分为三步:
创建注解(Create a constraint annotation)
创建验证类(Implement a validator)
定义默认错误信息(Define a default error message)
第一步,创建注解:
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { EmailValidator.class })
public @interface Email {
String message() default "这不是有效的电子邮件格式";
/**
* @return the regular expression to match
*/
String regexp() default "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9]+\\.[a-zA-Z]{2,4}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
/**
* Defines several {@link Size} annotations on the same element.
*
* @see Size
*/
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@interface List {
Email[] value();
}
}
通过@interface关键字来创建注解,而每一个方法就是注解的一个参数。比如上面的代码,就可以这样使用@Email(regexp="...",message="...")
。其它可以不用去管,直接复制就可以了,要注意的是@Constraint(validatedBy = { EmailValidator.class })
,这里指定注解的验证类,根据实际替换类名。
第二步,创建验证类:
public class EmailValidator implements ConstraintValidator<Email, String>{
private String regexp;
@Override
public void initialize(Email constraintAnnotation) {
this.regexp = constraintAnnotation.regexp();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(value==null){return true;}
if( value.matches(regexp)){
return true;
}
return false;
}
}
这里只要实现ConstraintValidator<Email, String>
接口就创建了一个验证器。initialize方法得到注解的regexp值,在isValid方法中进行验证,符合正则表达式就返回true,否则返回false。
需要注意的是,当value为空,也就是验证的对象没有初始化的时候,要编写相应的验证规则,不然会报错的。在上面代码中编写的是:
if(value==null){return true;}
也即是,当验证对象为空时,返回成功。
第三步是编写默认错误信息。其实这一步在第一步已经做了,通过default,所以这步不用做。
来源:https://blog.csdn.net/ruangong1203/article/details/51002360
猜你喜欢
- 1、修改application.properties新建 Mapper、实体类 相应的文件夹,将不同数据源的文件保存到对应的文件夹下# te
- 本文设计一个简单的班级管理系统,满足如下要求:1、设计学生类Student,包含学号(String型)、姓名(String型)、
- 在使用JDBC的时候,数据库据连接是非常宝贵的资源。为了复用这些资源,可以将连接保存在一个队列中。当需要的时候可以从队列中取出未使用的连接。
- 背景接上文《失踪人口回归,mybatis-plus 3.3.2 发布》[1] ,提供了一个非常实用的功能 「数据安全保护」 功能,不仅支持数
- java的jar是一个打包工具,用于将我们编译后的class文件打包起来,这里面主要是举一个例子用来说明这个工具的使用。在C盘下的temp文
- Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new
- 一.显示、隐藏 jQuery 中显示方法为:.show(),隐藏方法为:.hide()。在无参数的时候,只是硬性的显示内容和隐藏内
- 引言一个复杂的分布式系统,用户发起一个请求,这个请求可能调用几十到几百个服务,经过很多业务层,而每个业务又是多个机器集群,一个请求具体被随机
- 多说无益,贴代码:/** * 校验银行卡卡号 * * @param cardId &nbs
- 前言:页面静态化其实就是将原来的 * 页(例如通过ajax请求动态获取数据库中的数据并展示的网页)改为通过静态化技术生成的静态网页,这样用户
- 最近需要对接支付宝的支付接口,官方文档写得内容有点分散,整理了一下发布出来,用作记录,同时也希望对不了解情况的人有所帮助,这里以电脑端的网页
- 在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked ex
- 目录登陆界面的实现登陆界面代码Login类login的监听类 LoginListener聊天界面运行图Client类代码Server代码登陆
- import java.util.Arrays;/** * 栈的实现<br> * @author Skip&
- OpenFeign介绍一开始,我们使用原生的 DiscoveryClient 发现服务和使用RestTemplate进行服务间调用,然后我们
- Java提示缺少返回值语句怎么办?这里我们给大家提供具体的解决方法。首先,以下面的程序为例,会看到在控制台有:错误:缺少返回语句的提示。找到
- 关于注入数据说明1.不通过配置文件注入数据通过@Value将外部的值动态注入到Bean中,使用的情况有:注入普通字符串注入操作系统属性注入表
- 一、首先我们先创建一个Maven项目把我们需要的包先准备好 1.打开pom.xml文件引入依赖,以下是整个pom.xml文件<
- 一、概述xml整合第三方框架有两种整合方案:不需要自定义名空间,不需要使用Spring的配置文件配置第三方框架本身内容,例如:MyBatis
- 1.springBoot的依赖确定项目中包含可以注解的依赖<dependency> <group