hibernate-validator校验框架学习
1、引入jar包
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.4</version>
</dependency>
注意:
- 当使用hibernate-validator更高版本时,会报一个java.lang.ClassNotFoundException: javax.el.ELManager错误,目前博主还未找到兼容的方案,因此采用了5.4.1.Final版本。
- 当不添加javax.el-api和javax.el依赖时,项目也可以运行,因为tomcat容器包含hibernate-validator所依赖的类
2、spring-mvc配置
<mvc:annotation-driven conversion-service="conversionService" validator="validator"/>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
<property name="validationMessageSource" ref="messageSource"></property>
</bean>
<!-- 检验错误信息资源配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:validator/validationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8"/>
<!-- 对资源文件内容的缓存时间,单位秒 -->
<property name="cacheSeconds" value="120"/>
</bean>
3、在实体上增加相应注解校验信息
private Integer stuId;
@NotBlank(message = "{notnull}")
@Size(max = 20, min = 2, message = "姓名长度在2-20之间")
private String name;
@Max(value = 200, message = "最大年龄200岁")
@Min(value = 6, message = "最小年龄6岁")
private Integer age;
注意:
message=“{notnull}”会去配置的错误文件中查找,即validator/validationMessages.properties文件中查找notnull的配置对应的错误信息。
4、使用方式
a) 自动校验
在实体上增加@Validated注解,表示要校验这个实体。BindingResult用于接收验证后的错误信息。
@RequestMapping(value = "/add", method = { RequestMethod.GET, RequestMethod.POST })
public String addStudent(Model model, HttpServletRequest request, @Validated Student stu,
BindingResult bindingResult) {
if (HttpRequestContext.GET.equalsIgnoreCase(request.getMethod())) {
return "prictice/student/addStudent";
} else {
if (bindingResult.hasErrors()) {
List<ObjectError> errors = bindingResult.getAllErrors();
model.addAttribute("errors", errors);
return "prictice/student/addStudent";
}
stu.setRegTime(new Date());
stu.setStatus(true);
studentService.addStudent(stu);
return "redirect:/student/list";
}
}
b) 主动校验
通过工具类,主动验证某个实体类
新建工具类ValidateUtil.java
public class ValidateUtil { public static <T> void validate(T obj) {
LocalValidatorFactoryBean validator = (LocalValidatorFactoryBean) SpringContextHolder.getBean("validator");
Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj);
Iterator<ConstraintViolation<T>> iter = constraintViolations.iterator();
while (iter.hasNext()) {
ConstraintViolation<T> error = iter.next();
StringBuffer buffer = new StringBuffer().append("[")
.append(error.getPropertyPath().toString()).append("]")
.append(error.getMessage());
throw new IllegalArgumentException(buffer.toString());
}
}
}
或者可以使用下面的代码获取validator
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
调用
@RequestMapping(value = "/add")
public String addStudent(@RequestParam Student stu) {
ValidateUtil.validate(stu);
return "redirect:/student/list"
}
5、常用注解
注解 |
作用 |
AssertTrue |
布尔值为真 |
AssertFalse |
布尔值为假 |
Null |
引用为空 |
NotNull |
引用不为空 |
NotEmpty |
字符串引用和值都不是空 |
Min |
数字的最小值 |
Max |
数字的最大值 |
Past |
日期必须是过去 |
Future |
日期必须是未来 |
Pattern |
字符串必须匹配正则表达式 |
Valid |
递归验证引用 |
Size |
验证字符串是否在Size范围内 |
|
验证字符串是否是一个有效的电子邮箱 |
URL |
字符串是否是一个有效的URL |
注意:
- @NotEmpty 用在集合类上面
- @NotBlank 用在String上面
- @NotNull 用在基本类型上
- @Email和@URL是Hibernate Validator自定义的,假如使用其他的Bean Validation实现,可能没有这两个注解。
- 和JPA注解一样,如果验证注解添加到字段上,Hibernate就会直接读取字段的值。如果注解到Getter方法上,Hibernate就会调用方法取得值。在一个类中不要同时应用这两种方式,会导致重复验证的问题。
- 如果在一个集合上应用Valid注解, Hibernate就会递归验证集合中的每一个元素。
hibernate-validator校验框架学习的更多相关文章
- springboot使用hibernate validator校验,Bean Validation校验
第一个地址:springboot使用hibernate validator校验,Bean Validation校验
- springboot使用hibernate validator校验
一.参数校验 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要 ...
- springboot使用hibernate validator校验方式
一.参数校验 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要 ...
- Hibernate Validator验证框架中@NotEmpty、@NotBlank、@NotNull 的区别
Hibernate Validator验证框架中@NotEmpty.@NotBlank.@NotNull的主要使用情况 @NotEmpty 用在集合类上面 @NotBlank 用在String上 ...
- Hibernate Validator校验参数全攻略
1. 前言 数据字段一般都要遵循业务要求和数据库设计,所以后端的参数校验是必须的,应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的. 2. 数据校验的痛点 为了保证数据语义的正确,我们 ...
- spring MVC 使用 hibernate validator验证框架,国际化配置
spring mvc使用hibernate validator框架可以实现的功能: 1. 注解java bean声明校验规则. 2. 添加message错误信息源实现国际化配置. 3. 结合sprin ...
- Struts2 校验框架学习笔记
Struts2 校验框架 Struts2 和Struts1同样也提供了校验框架,但在Struts2 已经不再把校验框架做为一个插件,而是已经内置到了Struts2中,而且配置起来更为简单方便,功能也更 ...
- spring boot中使用javax.validation以及org.hibernate.validator校验入参
这里springboot用的版本是:<version>2.1.1.RELEASE</version> 自带了hibernate.validator,所以不用添加额外依赖 1.创 ...
- Java笔记 #07# Hibernate Validator
Hibernate Validator是Spring Boot默认附带的标准校验API(javax.validation)实现. 应用实例(配合切面) 采用注解定义切面.java @Aspect @C ...
随机推荐
- meta标签常见浏览器设置
一.如何让双核浏览器默认选择 WebKit 内核渲染自己开发的网页 我们可以使用标签来指定适合自己网站的渲染内核名称,当双核浏览器访问本网页时,就会根据我们的指示,选择我们指定的渲染内核来处理网页.若 ...
- js的数据类型、函数、流程控制及变量的四种声明方式
运算符 基本运算符 加 + 减 - 乘 * 除 / 取余 % 自增 ++ eg: 1++ 或 ++1 自减 -- eg: 1-- 或 --1 注:++或--写在前面表示优先级最高,先进行自增或者自减 ...
- 【问题】redhat安装dig
转自:https://blog.csdn.net/ricky_hust/article/details/8868131 最终可行的方法 在linux下没有单独的dig和nslookup的包,而是以bi ...
- centos7下postgresql数据库安装及配置
1.安装 #yum install -y postgresql-server 2.postgresql数据库初始化 #service postgresql initdb 3.启动postgresql服 ...
- border边框设置为1px
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- mongodb索引简介
上面讲解了数据的查询和索引的简单使用,并且说明索引可以显著的加快查询速度,实际上查询的种类有很多,与之对应的索引的种类也有很多,接下来会与索引一起,在说明索引种类的同时,详细介绍下查询的参数 1.索引 ...
- Window脚本学习笔记之定时关闭进程
定时关闭进程, 从字面上即可看出操作分为两个步骤,即: 1,结合“任务计划程序”,定时. “计算机->管理->计划任务程序”,作用是让系统定时启动脚本文件(bat脚本). 2,结合“nt ...
- Java基础 与时间日期相关的类:System -Date -SimpleDateFormat -Calendar类 -解决后缀.000Z 的时区问题
笔记总结: /**与时间相关的类:System_Date_SimpleDateFormat_Calendar类 * 1.system 类下的currentTimeMillis() * 输出从1970年 ...
- python yaml文件内容的读取
示例: (1)host_header.yaml 文件中的内容 host: https://testapp.goodiber.com/v2/ #dev1的测试环境域名 #请求接口的请求头中的共用参数 ...
- PageHelper使用中出现的问题
PageHelper在分页查询的时候功能强大,内部使用拦截器实现.这边文章做了详细的介绍. https://www.cnblogs.com/ljdblog/p/6725094.html https:/ ...