Hibernate Validation使用示例及讲解
Hibernate Validation使用示例及讲解
时间 -- :: ITeye-博客
原文 http://wdmcygah.iteye.com/blog/2174680
主题 Java 在项目开发过程中,后台在很多场景都需要进行校验操作,比如:前台表单提交到后台,系统接口调用,数据传输等等。而且很多项目都采用MVC分层式设计,每层还有需要进行相应地校验,这样在项目较大,多人协作开发的时候,会造成大量重复校验代码,且出错率高。 针对这个问题, JCP 出台一个 JSR -Bean Validation规范 ,而Hibernate Validator 作为Bean Validation的参考实现,提供了JSR 303规范中所有内置constraint的实现,除此之外还有一些附加的constraint。 Hibernate Validation的使用非常简单,只用在相应的实体类中加上注解,再调用对应的校验API方法即可。 Hibernate Validation目前最新的稳定版本是:5.1.。 下载地址 官网地址 官方英文使用手册 官方中文使用手册地址 (中文版目前最新的是4.3版本) 具体使用方法请查看上面的官方使用手册地址,每个注解对应的含义在官方手册2.4章节有详细介绍,内容太多我就不贴过来了。下面直接上最常用情况(实体类校验)的示例代码。 一、依赖包 J2SE环境下除了需要引入Hibernate Validation包外,还需要额外引入两个实现表达式语言的包。J2EE环境如果容器提供不需要再引入。下面是J2SE环境下的依赖包: <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1..Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>2.2.</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.</version>
</dependency> 二、校验工具类 工具类提供了校验实体类、实体字段的方法,返回一个自定义的校验对象。 /**
* 校验工具类
* @author wdmcygah
*
*/
public class ValidationUtils { private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); public static <T> ValidationResult validateEntity(T obj){
ValidationResult result = new ValidationResult();
Set<ConstraintViolation<T>> set = validator.validate(obj,Default.class);
if( CollectionUtils.isNotEmpty(set) ){
result.setHasErrors(true);
Map<String,String> errorMsg = new HashMap<String,String>();
for(ConstraintViolation<T> cv : set){
errorMsg.put(cv.getPropertyPath().toString(), cv.getMessage());
}
result.setErrorMsg(errorMsg);
}
return result;
} public static <T> ValidationResult validateProperty(T obj,String propertyName){
ValidationResult result = new ValidationResult();
Set<ConstraintViolation<T>> set = validator.validateProperty(obj,propertyName,Default.class);
if( CollectionUtils.isNotEmpty(set) ){
result.setHasErrors(true);
Map<String,String> errorMsg = new HashMap<String,String>();
for(ConstraintViolation<T> cv : set){
errorMsg.put(propertyName, cv.getMessage());
}
result.setErrorMsg(errorMsg);
}
return result;
}
} 三、校验返回对象 /**
* 校验结果
* @author wdmcygah
*
*/
public class ValidationResult { //校验结果是否有错
private boolean hasErrors; //校验错误信息
private Map<String,String> errorMsg; public boolean isHasErrors() {
return hasErrors;
} public void setHasErrors(boolean hasErrors) {
this.hasErrors = hasErrors;
} public Map<String, String> getErrorMsg() {
return errorMsg;
} public void setErrorMsg(Map<String, String> errorMsg) {
this.errorMsg = errorMsg;
} @Override
public String toString() {
return "ValidationResult [hasErrors=" + hasErrors + ", errorMsg="
+ errorMsg + "]";
} } 四、被校验实体 public class SimpleEntity { @NotBlank(message="名字不能为空或者空串")
@Length(min=,max=,message="名字必须由2~10个字组成")
private String name; @Past(message="时间不能晚于当前时间")
private Date date; @Email(message="邮箱格式不正确")
private String email; @Pattern(regexp="/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{5,10}$/",message="密码必须是5~10位数字和字母的组合")
private String password; @AssertTrue(message="字段必须为真")
private boolean valid; //get set方法省略,自己添加
} 有些情况下,Hibernate Validation自带的注解不能够满足需求,我们想定制一个注解进行使用,此时可以参考下面的示例(自定义密码注解及校验规则)。 一、密码注解 package research.hibernate.validation.extend; import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target; import javax.validation.Constraint;
import javax.validation.Payload; @Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = PasswordValidator.class)
@Documented
public @interface Password { String message() default "{密码必须是5~10位数字和字母组合}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {};
} 二、密码校验类 /**
* 自定义密码校验类
* @author wdmcygah
*
*/
public class PasswordValidator implements ConstraintValidator<Password, String> { //5~10位的数字与字母组合
private static Pattern pattern = Pattern.compile("(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{5,10}"); public void initialize(Password constraintAnnotation) {
//do nothing
} public boolean isValid(String value, ConstraintValidatorContext context) {
if( value==null ){
return false;
}
Matcher m = pattern.matcher(value);
return m.matches();
}
} 三、被校验实体 public class ExtendEntity { @Password
private String password; public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} } 对应的测试类如下: public class ValidationUtilsTest extends TestCase{ public void validateSimpleEntity() {
SimpleEntity se = new SimpleEntity();
se.setDate(new Date());
se.setEmail("");
se.setName("");
se.setPassword("");
se.setValid(false);
ValidationResult result = ValidationUtils.validateEntity(se);
System.out.println("--------------------------");
System.out.println(result);
Assert.assertTrue(result.isHasErrors());
} public void validateSimpleProperty() {
SimpleEntity se = new SimpleEntity();
ValidationResult result = ValidationUtils.validateProperty(se,"name");
System.out.println("--------------------------");
System.out.println(result);
Assert.assertTrue(result.isHasErrors());
} public void validateExtendEntity() {
ExtendEntity ee = new ExtendEntity();
ee.setPassword("");
ValidationResult result = ValidationUtils.validateEntity(ee);
System.out.println("--------------------------");
System.out.println(result);
Assert.assertTrue(result.isHasErrors());
}
} 代码在JDK1.8下测试通过。 完整代码可查看我的Github仓库: https://github.com/wdmcygah/research-J2SE 备注: ()上述示例只是展示了Hibernate Validation比较常用的示例,框架其实还支持方法返回值、方法参数校验,另外也可以通过XML进行配置,校验还可以分组、合并等等。这些内容请查阅官方使用手册。 ()另外还有一个也还不错的校验框架:OVAL。 OVAL源码地址
Hibernate Validation使用示例及讲解的更多相关文章
- Spring Boot 系列教程19-后台验证-Hibernate Validation
后台验证 开发项目过程中,后台在很多地方需要进行校验操作,比如:前台表单提交,调用系统接口,数据传输等.而现在多数项目都采用MVC分层式设计,每层都需要进行相应地校验. 针对这个问题, JCP 出台一 ...
- Struts2+Hibernate+Spring 整合示例
转自:https://blog.csdn.net/tkd03072010/article/details/7468769 Struts2+Hibernate+Spring 整合示例 Spring整合S ...
- JSR303/JSR-349,hibernate validation,spring validation 之间的关系
JSR303是一项标准,JSR-349是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,他们位于javax.validation.co ...
- spring-boot 使用hibernate validation对参数进行优雅的校验
springboot天生支持使用hibernate validation对参数的优雅校验,如果不使用它,只能对参数挨个进行如下方式的手工校验,不仅难看,使用起来还很不方便: if(StringUtil ...
- Spring MVC-集成(Integration)-Hibernate验证器示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_hibernate_validator.htm 说明:示例基于Spring MVC ...
- spring 数据校验之Hibernate validation
1.需要的jar包 2.springsevlet-config.xml配置 在spring3之后,任何支持JSR303的validator(如Hibernate Validator)都可以通过简单配置 ...
- Hibernate validation 注解 springmvc 验证 分组
SpringMVC验证框架Validation特殊用法 1. 分组 有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下使用不同验证方式,比如说对于一个实体类来的id来说,保存的时候是不需 ...
- Hibernate Validation各注解的用法
Bean Validation 中内置的 constraint @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 ...
- Hibernate第二篇【API讲解、执行流程图】
前言 从上一篇中已经大致介绍了Hibernate并且有了一个快速入门案例的基础了,-.本博文主要讲解Hibernate API 我们看看快速入门案例的代码用到了什么对象吧,然后一个一个讲解 publi ...
随机推荐
- C#量转换为汉字表达
/* 创造者:菜刀打好博客 * 创建日期: 2014年09一个月04号码 * 特征:Money类型转换 * */ namespace Net.String.ConsoleApplication ...
- android listview综合使用演示样例_结合数据库操作和listitem单击长按等事件处理
本演示样例说明: 1.自己定义listview条目样式,自己定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,而且操作后listview自己主动刷新. 3.响应用 ...
- android PreferenceScreen使用笔记
preference.xml <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen ...
- Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息01
1.系统联系人的数据库(3张最重要的表) (1)raw_contacts 联系人表 保存联系人的id contact_id (2)data 数据表 保存联系人的数据 ( ...
- windows下配置两个或多个Tomcat启动的方法
确保window的环境变量中找不到CATALINA_HOME和CATALINA_BASE 修改server.xml,用解压版的tomcat,不要用安装版的. 1.修改http访问端口 conf下的se ...
- Matcher Pattern 正则表达式 示例
示例 public class Test { public static void main(String[] args) throws IOException { Patte ...
- CI框架深入篇(2)一些基础的我之不知道的标准格式
1,一些命名规则:类文件名必大写,其他配置文件,视图文件或着脚本都要小写,类文件名和类名要一致!! 2,类名要大写开头,若是多个单词,那就下划线不要驼封法: 3,变量名要小写全,多个单词下划线分割,后 ...
- java里面的equals和hashcode的总结
问题1: java比较两个对象,除了equals,为什么还要重写hashcode方法? 基本类型比较,用==就可以了. 对象比较,equals比较是对象的内存地址,hashcode比较的也是对象的内存 ...
- NotImplementedException未实现该方法或操作
使用DevExpress为控件CheckedListBoxControl绑定DataSource时,引发异常“NotImplementedException未实现该方法或操作”,代码如下: this. ...
- (转)解析php中die(),exit(),return的区别
本篇文章是对php中die(),exit(),return的区别进行了详细的分析介绍,需要的朋友参考下 die()停止程序运行,输出内容exit是停止程序运行,不输出内容return是返回值d ...