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 ...
随机推荐
- HDU1159 && POJ1458:Common Subsequence(LCS)
Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...
- 头像上传ASP.NET MVC实现-可拖动大小实时预览
这是一个ASP.NET MVC实现的类似于dz论坛的上传头像功能.可以拖动选择大小,支持多种尺寸生成. 效果界面 头像上传源码下载 项目中具体应用时,请根据需求做调整.欢迎交流~回复即可下载~源码下载 ...
- Linux popen/pclose
popen() 函数 #include <stdio.h>FILE * popen(const char *command , const char *type );int pclose( ...
- openvpn server部署笔记
openvpn server 部署 1.准备 安装依赖 yum -y install gcc gcc-c++ openssl-devel openssl pam-devel 2.安装 lzo cd / ...
- 用户 'IIS APPPOOL\ExportExcel' 登录失败。
解决了前两个错误,在成功打开项目后,在访问数据库又越到如下错误 “/”应用程序中的服务器错误. 用户 'IIS APPPOOL\ExportExcel' 登录失败. 说明: 执行当前 Web 请求期间 ...
- css书写步骤
CSS整体书写步骤1:CSS RESET 重置2:CSS GLABAL 全局属性3: CSS分模块属性,(先写默认样式和设计图相差最大的部分,先大块布局,后细致调整) <style>/*C ...
- 监听UITabBarItem来拦截是否要跳转
情景是这样的: 我需要在用户点击"我的"的时候, 判断是否已经登录, 如果没有, 就不进入该界面, 而是跳转到用户登录界面, 所以这里我需要进行UITabBarItem点击事件的拦 ...
- UITableViewCell实现3D缩放动画
gif效果图: 代码部分: import UIKit class TableViewController: UITableViewController { override func viewDidL ...
- 武汉科技大学ACM :1002: A+B for Input-Output Practice (II)
Problem Description Your task is to Calculate a + b. Input Input contains an integer N in the first ...
- Java学习笔记(1):注释规范
注释规范 1. 类注释 在每个类前面必须加上类注释,注释模板如下: 2. 属性注释 在每个属性前面必须加上属性注释,注释模板如下: 3. 方法注释 在每个方法前面必须加上方法注释,注释模板 ...