- 浏览: 3431446 次
- 性别:
- 来自: 珠海
文章分类
- 全部博客 (1633)
- Java (250)
- Android&HTML5 (111)
- Struts (10)
- Spring (236)
- Hibernate&MyBatis (115)
- SSH (49)
- jQuery插件收集 (55)
- Javascript (145)
- PHP (77)
- REST&WebService (18)
- BIRT (27)
- .NET (7)
- Database (105)
- 设计模式 (16)
- 自动化和测试 (19)
- Maven&Ant (43)
- 工作流 (36)
- 开源应用 (156)
- 其他 (16)
- 前台&美工 (119)
- 工作积累 (0)
- OS&Docker (83)
- Python&爬虫 (28)
- 工具软件 (157)
- 问题收集 (61)
- OFbiz (6)
- noSQL (12)
最新评论
-
HEZR曾嶸:
你好博主,这个不是很理解,能解释一下嘛//左边+1,上边+1, ...
java 两字符串相似度计算算法 -
天使建站:
写得不错,可以看这里,和这里的这篇文章一起看,有 ...
jquery 遍历对象、数组、集合 -
xue88ming:
很有用,谢谢
@PathVariable映射出现错误: Name for argument type -
jnjeC:
厉害,困扰了我很久
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# -
TopLongMan:
非常好,很实用啊。。
PostgreSQL递归查询实现树状结构查询
http://oklook249900241.iteye.com/blog/1231096
Hibernate-validator是JSR303的一个实现。JSR303中定义了一种可以用Annotation来验证EntityBean信息 有效性的方式。虽然叫Hibernate-validator,但它是一个单独的jar文件,完全可以脱离Hibernate使用和扩展。
其依赖于”validation-api.jar”,”slf4j-api.jar”,”jaxb-api.jar”以及”jaxb-impl.jar”。
Maven项目可配置:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.0.2.GA</version>
</dependency>
Hibernate-validator本身提供了诸多基本的验证比如,非空,长度,最大最小值,Email、RUL格式,范围,正则表达式等。如下:
@NotNull 验证非null。
@NotBlank 验证字符串非null,且长度必须大于0。
@Size(min=,max=) 验证元素是否在min和max之间的,可用于验证字段长度,和集合个数。
@Min 验证元素的值一定大于min指定的值。
@Max 验证元素的值一定小于max指定的值。
@Length(min=,max=) 验证字符串长度是否在min和max之间.
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Email 验证字符串是否是合法的Email格式.
@URL(protocol=,host=,port=) 验证字符串是否是合法的URL格式.
@Range(min=,max=) 验证指定元素的值是否在指定范围之内。
@Pattern(regex=,flag=) 根据指定的正则表达式来做特殊格式字符串的验证。
……
Example:
public class Bean {
@NotNull(message="not_null.bean.name")
@Size(min=5,max=10,message="length.bean.name")
private String name;
@Digits(integer=3,fraction=4,message="digits.bean.num")
private String num;
@NotNull(message="not_null.bean.pass")
@Length(min=6,max=12,message="length.bean.pass")
private String pass;
@NotNull(message="not_null.bean.age")
@Max(60)
@Min(10)
private Integer age;
@Email(message="email.bean.email")
private String email;
@Range(min=10000,max=50000,message="range.bean.wage")
private BigDecimal wage;
}
每个Annotation都能指定message属性,这是在验证不通过时返回的信息。
定义了EntityBean并加入Annotation后,我们可以在验证的类中使用如下方式来对Bean进行验证:
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<Pojo>> constraintViolations = validator.validate(pojo);
for(Iterator<ConstraintViolation<Pojo>> i = constraintViolations.iterator(); i.hasNext();) {
ConstraintViolation<Pojo> v = i.next();
System.out.println(v.getMessage());
}
然而在很多情况下,上述验证并不能够完成我们的需求。在业务流程中会出现一些更加复杂的验证,如:当字段A为”Y”时,字段B必须不为空;或者当字段A- D中,要么A和B的总长度大于10,要么C和D的总长度大于10,否则返回错误。诸如这种情况,我们需要自定义一个Annotation来专门处理。
首先,定义一个Annotation:
@Retention(RUNTIME)
@Constraint(validatedBy=JointNotNullValidator.class)
@Documented
public @interface JointNotNull {
String message() default "{com.hp.validator.jointNotNull}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Constraint 指定了具体处理验证过程的类。如下再定义一个处理类:JointNotNullValidator。
public class JointNotNullValidator implements ConstraintValidator<JointNotNull, Object> {
public boolean isValid(Object obj, ConstraintValidatorContext constraintContext) {
if(obj instanceof TestOBJ) {
TestOBJ testOBJ = (TestOBJ)obj;
if((testOBJ.getA()!=null&& testOBJ.getA().equals("Y")) && (testOBJ.getB()==null || testOBJ.getB().length()==0)) {
return false;
}
return true;
}
return false;
}
public void initialize(JointNotNull joindNull) {
}
}
处理类需要去继承ConstraintValidator接口,第一个泛型指定当前处理类属于哪个Annotation,第二个泛型指定被注解的Bean 类型。在isValid方法中实现具体的验证逻辑,即:当TestOBJ中的A为”Y”时,B必须不为空。initialize方法则可以做一些初始化操 作,比如获取调用者给定的value值和message值,都可以通过传入的参数(所属的Annotation对象)中得到。这样在有些验证中就能依赖于 给定的属性来做处理。
完成后,就能将@JointNotNull 同其他Annotation一样使用了。
有个注意点:
在定义Annotation时可以定义@Target属性,如:
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy=TodayValidator.class)
@Documented
public @interface Today {
String message() default "{com.hp.validator.today}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Target其实是限制了当前Annotation的使用范围,比如现在这个就只能被用在方法,字段,和其它Annotation上,而不能放在类上。 如果被放在了字段上,那么在具体验证类中isValid方法的第一个参数被传入的就是被注解的字段对象,但如果放在了类上,那么isValid中得到的就 是整个类对象。而后者可以轻易得到这个类中其它字段的信息,以便解决需要依赖其它字段来做验证的情况,前者就只能对当前字段做验证,无法获取到其它字段信 息。
因为验证的调用代码都是一样的,可以将其放到一个类中,由Spring的AOP做切面逻辑。这样只要做一个封装,我们就能将整个项目的验证都抽离到一个模块中做统一的验证管理,而在业务方法中就不需要再考虑参数验证问题了,可以更专注于业务逻辑。
Hibernate-validator是JSR303的一个实现。JSR303中定义了一种可以用Annotation来验证EntityBean信息 有效性的方式。虽然叫Hibernate-validator,但它是一个单独的jar文件,完全可以脱离Hibernate使用和扩展。
其依赖于”validation-api.jar”,”slf4j-api.jar”,”jaxb-api.jar”以及”jaxb-impl.jar”。
Maven项目可配置:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.0.2.GA</version>
</dependency>
Hibernate-validator本身提供了诸多基本的验证比如,非空,长度,最大最小值,Email、RUL格式,范围,正则表达式等。如下:
@NotNull 验证非null。
@NotBlank 验证字符串非null,且长度必须大于0。
@Size(min=,max=) 验证元素是否在min和max之间的,可用于验证字段长度,和集合个数。
@Min 验证元素的值一定大于min指定的值。
@Max 验证元素的值一定小于max指定的值。
@Length(min=,max=) 验证字符串长度是否在min和max之间.
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Email 验证字符串是否是合法的Email格式.
@URL(protocol=,host=,port=) 验证字符串是否是合法的URL格式.
@Range(min=,max=) 验证指定元素的值是否在指定范围之内。
@Pattern(regex=,flag=) 根据指定的正则表达式来做特殊格式字符串的验证。
……
Example:
public class Bean {
@NotNull(message="not_null.bean.name")
@Size(min=5,max=10,message="length.bean.name")
private String name;
@Digits(integer=3,fraction=4,message="digits.bean.num")
private String num;
@NotNull(message="not_null.bean.pass")
@Length(min=6,max=12,message="length.bean.pass")
private String pass;
@NotNull(message="not_null.bean.age")
@Max(60)
@Min(10)
private Integer age;
@Email(message="email.bean.email")
private String email;
@Range(min=10000,max=50000,message="range.bean.wage")
private BigDecimal wage;
}
每个Annotation都能指定message属性,这是在验证不通过时返回的信息。
定义了EntityBean并加入Annotation后,我们可以在验证的类中使用如下方式来对Bean进行验证:
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<Pojo>> constraintViolations = validator.validate(pojo);
for(Iterator<ConstraintViolation<Pojo>> i = constraintViolations.iterator(); i.hasNext();) {
ConstraintViolation<Pojo> v = i.next();
System.out.println(v.getMessage());
}
然而在很多情况下,上述验证并不能够完成我们的需求。在业务流程中会出现一些更加复杂的验证,如:当字段A为”Y”时,字段B必须不为空;或者当字段A- D中,要么A和B的总长度大于10,要么C和D的总长度大于10,否则返回错误。诸如这种情况,我们需要自定义一个Annotation来专门处理。
首先,定义一个Annotation:
@Retention(RUNTIME)
@Constraint(validatedBy=JointNotNullValidator.class)
@Documented
public @interface JointNotNull {
String message() default "{com.hp.validator.jointNotNull}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Constraint 指定了具体处理验证过程的类。如下再定义一个处理类:JointNotNullValidator。
public class JointNotNullValidator implements ConstraintValidator<JointNotNull, Object> {
public boolean isValid(Object obj, ConstraintValidatorContext constraintContext) {
if(obj instanceof TestOBJ) {
TestOBJ testOBJ = (TestOBJ)obj;
if((testOBJ.getA()!=null&& testOBJ.getA().equals("Y")) && (testOBJ.getB()==null || testOBJ.getB().length()==0)) {
return false;
}
return true;
}
return false;
}
public void initialize(JointNotNull joindNull) {
}
}
处理类需要去继承ConstraintValidator接口,第一个泛型指定当前处理类属于哪个Annotation,第二个泛型指定被注解的Bean 类型。在isValid方法中实现具体的验证逻辑,即:当TestOBJ中的A为”Y”时,B必须不为空。initialize方法则可以做一些初始化操 作,比如获取调用者给定的value值和message值,都可以通过传入的参数(所属的Annotation对象)中得到。这样在有些验证中就能依赖于 给定的属性来做处理。
完成后,就能将@JointNotNull 同其他Annotation一样使用了。
有个注意点:
在定义Annotation时可以定义@Target属性,如:
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy=TodayValidator.class)
@Documented
public @interface Today {
String message() default "{com.hp.validator.today}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Target其实是限制了当前Annotation的使用范围,比如现在这个就只能被用在方法,字段,和其它Annotation上,而不能放在类上。 如果被放在了字段上,那么在具体验证类中isValid方法的第一个参数被传入的就是被注解的字段对象,但如果放在了类上,那么isValid中得到的就 是整个类对象。而后者可以轻易得到这个类中其它字段的信息,以便解决需要依赖其它字段来做验证的情况,前者就只能对当前字段做验证,无法获取到其它字段信 息。
因为验证的调用代码都是一样的,可以将其放到一个类中,由Spring的AOP做切面逻辑。这样只要做一个封装,我们就能将整个项目的验证都抽离到一个模块中做统一的验证管理,而在业务方法中就不需要再考虑参数验证问题了,可以更专注于业务逻辑。
发表评论
-
spring配置事物的方式:注解和aop配置
2016-05-14 00:26 4112参考: Spring AOP中pointcut express ... -
写个mybatis的拦截插件,实现将所有执行的sql写入文件里
2016-05-12 15:59 5113原文 http://3131854.blog.51cto.co ... -
Mybatis分库分表扩展插件
2016-05-12 15:47 1632http://fangjialong.iteye.com/bl ... -
spring+mybatis+atomikos 实现JTA事务
2016-05-11 22:00 5531sping配置多个数据源 不同用户操作不同数据库 http:/ ... -
ibatis扩展支持主键生成的方法(非数据库方式)
2016-04-13 22:01 985http://blog.csdn.net/warison200 ... -
ibatis 动态 Mapped Statement
2016-03-31 17:02 865http://www.cnblogs.com/lcngu/p/ ... -
分布式事务管理
2016-03-31 16:43 1044http://my.oschina.net/pingpangk ... -
ibatis中动态查询表返回用resultClass="java.util.HashMap" 的问题
2016-03-11 10:49 1130http://blog.csdn.net/dyllove98/ ... -
Mybatis传多个参数(三种解决方案)
2016-03-07 17:46 1454http://my.oschina.net/ydsakyclg ... -
mybatis --mapper配置文件中大于小于怎么处理
2016-03-04 14:21 2418http://blog.csdn.net/nich002/ar ... -
Mybatis 数据库物理分页插件 PageHelper
2015-11-28 01:09 2800http://www.cnblogs.com/digdeep/ ... -
Druid 的SQL翻译功能如何使用
2015-11-27 21:40 1987Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接 ... -
[MyBatis]mapperLocations属性通配符的使用
2015-11-26 10:49 6236http://blog.csdn.net/szwangdf/a ... -
Hibernate Validation使用示例及讲解
2015-11-22 21:06 2764http://wdmcygah.iteye.com/blog/ ... -
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
2015-11-17 17:54 20188http://blog.csdn.net/weibing_hu ... -
SpringMVC + Mybatis + Shiro 权限整合
2015-11-14 14:06 8752详细见参考文章: 基于Spring + Spring MVC ... -
MyBatis3 的Mapper XML 文件详解
2015-11-13 11:54 1365MyBatis3 的Mapper XML 文件http://m ... -
HibernateDao.java
2015-11-10 15:55 1170http://my.oschina.net/lizy/blog ... -
Hibernate envers开发指南
2015-10-24 00:44 1248http://www.blogjava.net/xmatthe ... -
Spring+Ibatis数据库水平分库
2015-09-13 21:15 1305Spring+Ibatis数据库水平分库 http://blo ...
相关推荐
Hibernate Validator 是一个强大的Java Bean验证框架,它实现了JSR 303(JavaBeans Validation 1.0)和JSR 349(JavaBeans Validation 1.1)规范,为开发者提供了丰富的数据验证功能。这些规范旨在标准化Java应用...
**Hibernate Validator 概述** Hibernate Validator 是一个基于 Java Bean Validation 规范的实现,它提供了一种在 Java 应用程序中进行数据校验的强大工具。这个规范定义了一种标准的注解,使得开发者可以方便地对...
《Hibernate Validator 使用指南》 Hibernate Validator 是一个强大的Java Bean验证框架,它基于JSR-303(Bean Validation)标准,提供了丰富的验证规则和自定义约束能力,使得开发者能够更方便地对Java对象进行...
**Hibernate Validator 演示** Hibernate Validator 是一个强大的 Java Bean 验证框架,它是 Java EE 和 Java SE 验证规范的实现。它提供了一种声明式的方式来验证对象的属性,使得开发者可以方便地在应用程序中...
Hibernate Validator 是一个强大的Java Bean验证框架,它是Hibernate项目的一部分,实现了JSR-303(Bean Validation 1.0)和JSR-349(Bean Validation 1.1)标准,提供了对对象模型的验证功能。在版本5.1.2.Final中...
本教程翻译自Hibernate Validator 4.0 GA指南,并参考JSR 303的规范,本着尽量不用JSR规范之外的特性,文档在编写时尽量不提及底层实现Hibernate Validator,而是关注Bean Validation规范本身。如果有不对之处,请...
Hibernate Validator是一个基于Java Bean Validation规范(JSR 349)的实现,它允许开发者通过注解的方式对Java Bean进行校验。Hibernate Validator 5.0.3版本是该实现的特定版本,本手册将详细介绍如何使用这一版本...
我的博客中的《Spring MVC、hibernate validator和i18n》文章描述的项目的源代码,该文是对Spring mvc, validation和i18n的一个入门级的tutorial。我的博客地址是http://blog.csdn.net/zjysource
《Hibernate Validator 深度解析:4.0.1.GA 版本详解》 Hibernate Validator,作为Java世界中的一款强大且广泛使用的验证框架,极大地简化了应用中的数据验证过程。本文将深入探讨 Hibernate Validator 4.0.1.GA ...
《深入理解Hibernate Validator:官方参考文档精要》 在探讨Hibernate Validator之前,我们先来了解一下其背景与核心价值。Hibernate Validator是Java Bean Validation(JSR 303)的参考实现,它为开发者提供了一套...
Validation 是 JSR 303 规范的一部分,它的实现之一就是 Hibernate Validator。Hibernate Validator 提供了一种标准的方式来校验对象的属性,使得在不同层之间可以共享验证逻辑,减少了代码重复,提高了代码质量。 ...
Hibernate Validator是Java社区规范JSR 380的参考实现,它是一个强大的校验器,用于校验Java Bean中的数据。它不仅支持JSR 303 Bean Validation规范定义的基本注解,还包括了一些额外的自定义约束注解。Hibernate ...
validation相关的jar包,包括hibernate-validator-4.3.0.Final.jar,jboss-logging-3.1.0.CR2.jar,validation-api.jar,validation-api-1.0.0.GA.jar
《Hibernate Validator 6.1.7 中文文档》是一份详尽的指南,专注于Jakarta Bean验证的实现,即Hibernate Validator。该文档旨在帮助开发者理解并有效地使用Hibernate Validator进行数据验证,避免在不同应用程序层中...
《JSR303与Hibernate Validator:数据验证的基石》 在Java世界中,数据验证是应用程序不可或缺的一部分,它确保了输入数据的质量和安全性。JSR303(Java Bean Validation)规范,作为Java EE 6的一个重要部分,提供...
Hibernate Validator用Annotations 给类或者类的属性加上约束,在运行期检查属性值是很优雅的.Hibernate Validator就是这样的一个框架.该框架是十分容易的(就像参考文档中宣称的那样),几乎没有什么学习曲线,...
《Hibernate Validator:数据合法性的守护者》 Hibernate Validator,作为Java世界中强大的验证框架,是Hibernate ORM项目的一个重要组成部分,其版本号5.1.3.Final代表着在该时间点上,开发者们对其实现的功能、...
《Hibernate Validator参考指南4.2Final详解》 Hibernate Validator,作为Java Bean Validation规范的实现,是Hibernate项目的一个重要组成部分,它提供了一套强大的数据验证框架,使得开发者在处理业务逻辑时能够...
hibernate-validator-6.0.2.Final-dist hibernate-validator-6.0.2.Final-dist hibernate-validator-6.0.2.Final-dist
3. **Hibernate Validator的使用**:Hibernate Validator提供了丰富的内置约束注解,如`@NotNull`、`@Size`、`@Min`、`@Max`等,可以方便地在实体类的属性上声明。同时,它还支持自定义验证注解和复杂的校验逻辑。 ...