文档: http://beanvalidation.org/1.1/spec/

API : http://docs.jboss.org/hibernate/beanvalidation/spec/1.1/api/

http://blog.sina.com.cn/s/blog_a3d2fd2d0101hyu7.html

http://haohaoxuexi.iteye.com/blog/1812584

JSR303是JAVA EE6中的子规范。用于对Java Bean的字段值进行校验,确保输入进来的数据在语义上是正确的,使验证逻辑从业务代码中脱离出来。JSR303是运行时数据验证框架,验证之后验证的错误信息会马上返回。有两个版本JSR303(BeanValidation1.0)和JSR349(BeanValidation1.1)。

javax.validation:validation-api:jar:1.1.0.Final

实现版本:

  • org.hibernate:hibernate-validator:5.2.4.Final
  • org.apache.bval:bval-jsr303:0.5
  • jersery

注解

@NotNull | 引用类型 | 注解元素必须非空

@Null | 引用类型 |元素为空

@Digits | byte,short,int,long及其包装器,BigDecimal,BigInteger,String| 验证数字是否合法。属性:integer(整数部分), fraction(小数部分)

@Future/@Past| java.util.Date, java.util.Calendar | 是否在当前时间之后或之前

@Max/@Min | byte,short,int,long及其包装器,BigDecimal,BigInteger | 验证值是否小于等于最大指定整数值或大于等于最小指定整数值

@Pattern | String |验证字符串是否匹配指定的正则表达式。属性:regexp(正则), flags(选项,Pattern.Flag值)

@Size | String, Collection, Map, 数组 | 验证元素大小是否在指定范围内。属性:max(最大长度), min(最小长度), message(提示,默认为{constraint.size})

@DecimalMax/@DecimalMin | byte,short,int,long及其包装器,BigDecimal,BigInteger,String | 验证值是否小于等于最大指定小数值或大于等于最小指定小数值

@Valid | |验证值是否需要递归调用

@Null

@NotNull

@AssertFalse

@AssertTrue

@DecimalMax(value) 不大于value的数值

@DecimalMin(value) 不小于value的数值

@Digits(integer,fraction) 整数部分不超过integer,小数部分不超过fraction

@Future 将来的日期

@Past 过去的日期

@Max(value) 不大于value的数值

@Min(value) 不小于value的数值

@Pattern(value) 满足指定正则表达式

@Size(max,min) 长度在min到max之间

定义自己的约束类型

定义注解,message、groups和payload三个属性是必须定义的。

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MoneyValidator.class) //用于限制的注解,验证类为MoneyValidator
public @interface Money {
String message() default"不是金额形式";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

定义验证类

public class MoneyValidator implements ConstraintValidator<Money, Double> {
private String moneyReg = "^\\d+(\\.\\d{1,2})?$";//表示金额的正则表达式
private Pattern moneyPattern = Pattern.compile(moneyReg);
public void initialize(Money money) {
// TODO Auto-generated method stub
}
public boolean isValid(Double value, ConstraintValidatorContext arg1) {
// TODO Auto-generated method stub
if (value == null)
return true;
return moneyPattern.matcher(value.toString()).matches();
}
}

ConstraintValidator使用了泛型,有两个类型参数。第一个类型是对应的initialize方法的参数类型(约束注解类型),第二个类型是对应的isValid方法的第一个参数类型。

Hibernate Validator

Hibernate Validator附加的constraint(hibernate-validator和validation-api)

@Email 被注释的元素必须是电子邮箱地址

@Length 字符串的大小必须在指定的范围内

@NotEmpty 被注释的字符串的必须非空

@Range 被注释的元素必须在合适的范围内

验证对象类型

字段约束

当约束被定义在字段上的时候, 这个字段的值是通过字段访问策略来获取并验证的. 也就是说Bean Validation的实现者会直接访问这个实例变量而不会调用属性的访问器(getter) 即使这个方法存在。静态字段或者属性是不会被校验的

属性约束

必须遵守JavaBeans规范,且定义在getter上,不能定义在setter上

类约束

约束继承

验证子类时所有基类中的约束也都会被使用

对象图

@Valid注解类中的对象属性

Validator接口

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
... = validator.validate(obj); //对一个给定的实体对象中定义的所有约束进行校验
... = validator.validateProperty(); //通过validateProperty()可以对一个给定实体对象的单个属性进行校验,需要符合JavaBean命名规范
... = validator.validateValue(); //校验如果把一个特定的值赋给一个类的某一个属性的话,是否会违反此类中定义的约束条件 ####约束提示信息
* 可直接通过注解的message属性设置
* 通过message提供模板,ValidationMessages.properties中定义 Spring MVC Validator接口
--------------------
定义Validator。 Supports方法用于判断当前的Validator实现类是否支持校验当前需要校验的实体类,只有当supports方法的返回结果为true的时候,该Validator接口实现类的validate方法才会被调用来对当前需要校验的实体类进行校验。
```java
public class UserValidator implements Validator {
public boolean supports(Class<?> clazz) {
return User.class.equals(clazz);
}
public void validate(Object obj, Errors errors) {
ValidationUtils.rejectIfEmpty(errors, "username", null, "Username is empty.");
User user = (User) obj;
if (null == user.getPassword() || "".equals(user.getPassword()))
errors.rejectValue("password", null, "Password is empty.");
}
}

使用Validator进行验证。在SpringMVC中我们可以使用DataBinder来设定当前Controller需要使用的Validator。

@Controller
public class UserController {
@InitBinder
public void initBinder(DataBinder binder) {
binder.setValidator(new UserValidator());
}
@RequestMapping("login")
public String login(@Valid User user, BindingResult result) {
if (result.hasErrors())
return "redirect:user/login";
return "redirect:/";
}
}

必须使用@Valid标注我们需要校验的参数user,否则Spring不会对它进行校验。另外我们的处理器方法必须给定包含Errors的参数,这可以是Errors本身,也可以是它的子类BindingResult,使用了Errors参数就是告诉Spring关于表单对象数据校验的错误将由我们自己来处理,否则Spring会直接抛出异常,而且这个参数是必须紧挨着@Valid参数的,即必须紧挨着需要校验的参数,这就意味着我们有多少个@Valid参数就需要有多少个对应的Errors参数,它们是一一对应的。

如果我们希望一个Validator对所有的Controller都起作用的话,我们可以通过WebBindingInitializer的initBinder方法来设定了。另外,在SpringMVC的配置文件中通过mvc:annotation-driven的validator属性也可以指定全局的Validator。

<mvc:annotation-driven validator="userValidator"/>

Spring可以通过@Resource或@AutoWired注解向ConstraintValidator注入对象。

Java数据校验(Bean Validation / JSR303)的更多相关文章

  1. springboot使用hibernate validator校验,Bean Validation校验

    第一个地址:springboot使用hibernate validator校验,Bean Validation校验

  2. Java参数验证Bean Validation 框架

    1.为什么要做参数校验? 参数校验和业务逻辑代码分离,参数校验代码复用,统一参数校验方式.校验不太通过时统一异常描述. 2.bean validation规范 JSR303 规范(Bean Valid ...

  3. Java参数校验工具validation实践

    介绍 在项目开发当中,数据校验是你必须要考虑和面对的事情,为此要写上一大串的代码进行校验,这样就会导致代码冗余和一些管理的问题. 例如下面的代码: public void push(List<L ...

  4. Bean Validation完结篇:你必须关注的边边角角(约束级联、自定义约束、自定义校验器、国际化失败消息...)

    每篇一句 没有任何技术方案会是一种银弹,任何东西都是有利弊的 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JSR303.JSR349.JSR380)H ...

  5. Spring官网阅读(十七)Spring中的数据校验

    文章目录 Java中的数据校验 Bean Validation(JSR 380) 使用示例 Spring对Bean Validation的支持 Spring中的Validator 接口定义 UML类图 ...

  6. 1. 不吹不擂,第一篇就能提升你对Bean Validation数据校验的认知

    乔丹是我听过的篮球之神,科比是我亲眼见过的篮球之神.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免 ...

  7. 《Java从入门到放弃》入门篇:springMVC数据校验

    昨天我们扯完了数据传递,今天我们来聊聊数据校验的问题.来,跟着我一起读:计一噢叫,一按艳. 在springMVC中校验数据也非常简单,spring3.0拥有自己独立的数据校验框架,同时支持JSR303 ...

  8. springMVC使用JSR303数据校验

    JSR303注解 hibernate validate是jsr 303的一个参考实现,除支持所有的标准校验注解外,他还支持扩展注解 spring4.0拥有自己独立的数据校验框架,同时支持jsr 303 ...

  9. Bean Validation规范

    以下内容转载自:https://www.ibm.com/developerworks/cn/java/j-lo-beanvalid/ Bean Validation规范介绍 JSR303 规范(Bea ...

随机推荐

  1. 一条代码解决各种IE浏览器兼容性问题

    在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案Google也给出了解决方案百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 <!Doctype html> ...

  2. dex文件格式二

    一. dex文件头 (1) magic value 在DexFile.c   dexFileParse函数中 会先检查magic opt 啥是magic opt呢? 我们刚刚从cache目录拷贝出来的 ...

  3. jquery----常用的函数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. c语言libcurl库的异步用法

    multi接口的使用会比easy 接口稍微复杂点,毕竟multi接口是依赖easy接口的,首先粗略的讲下其使用流程:curl_multi _init初始化一个multi curl对象,为了同时进行多个 ...

  5. ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟

    中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...

  6. SpringMVC拦截器

    springmvc的拦截器 需求:进行用户的访问控制,判断用户是否登陆,如果登陆进行正常访问,如果没有登陆跳转到登陆页面. 1自定义拦截器类 package org.guangsoft.utils; ...

  7. xamarin真的是一个鸡肋吗?

    team leader 极力推荐 Xamarin,于是下载下来体验了一把,并没有觉得用它来开发 App 会爽到哪里去,可能对于从事 C#开发的开发人员来说是个福音吧.于是看看别人对其评价如何,现粘贴如 ...

  8. ios升级<注:来着微信平台>

    <来着微信平台>  http://mp.weixin.qq.com/s?__biz=MjM5NTIyNTUyMQ==&mid=2709545194&idx=1&sn ...

  9. .NET 获取客户端的操作系统版本、浏览器版本和IP地址

    我们在使用.NET做网站的时候,很多情况下需要需要知道客户端的操作系统版本和浏览器版本,怎样获取客户端的操作系统和浏览器版本呢?我们可以通过分析UserAgent来获取. .NET 获取客户端的操作系 ...

  10. MySQL批量删除指定前缀表

    Select CONCAT( 'drop table ', table_name, ';' ) FROM information_schema.tables Where table_name LIKE ...