这篇博客文章是关于Bean Validation规范的概述。未来的博客文章将深入探讨规范的特定方面。
我们刚刚发布了JSR 303 Bean Validation的早期草案评审。这个草案的目标是收集来自多方面社区的意见和建议
- 应用开发者(SE、EE、GUI、流程、数据库)
- 库开发者
- 工具开发者
- 其他JSR专家小组,包括JSF 2.0、Java Persistence 2.0和WebBeans
请下载规范草案并给我们反馈。
目标
验证数据是当今应用程序中常见的任务,遍布于几个(如果不是所有)层。因为每个层都以其自己的方式定义验证规则,所以重复和错误相当常见。

Bean Validation规范通过提供以下内容来解决此问题:
- 一个可扩展的基于注解的验证声明模型(也将提供XML部署描述符)
- 一个标准的运行时验证API
- 一个标准的元数据查询API
通过提供围绕对象验证的标准框架,本规范旨在成为Java生态系统中验证声明和验证执行的主要提供者。同一组验证将由所有应用层共享。
表达约束
约束主要通过注解来表达。在类、字段或getter上添加约束就像在它上面添加约束注解一样简单。约束会检查注解元素的值。
public class Address { @NotEmpty @Max(50) private String street1; @Max(50) private String street2; @Max(9) @NotNull private String zipcode; ... }
验证一个对象等价于验证其在字段、getter、类、超类和接口上声明的所有约束
- 其字段
- 其getter
- 其类
- 其超类
- 其接口
关注自己的约束
约束不仅限于内置注解。任何应用程序都可以定义自己的一组附加约束。约束由以下组成
- 一个注解
- 一个约束验证实现
虽然注解表达了域模型上的约束,但验证实现决定给定的值是否通过约束。
消息
约束可以定义当失败发生时返回的自定义错误消息。
public class Address { @NotEmpty(message="The street is mandatory") private String street1;
规范提供了一种外部化这些消息的方法:这将在后续文章中介绍。
对象图验证
将整个对象图进行验证而不是手动验证每个单个对象是非常方便的。@Valid允许您将关联对象包含在验证过程中
public class Order { @OrderNumber private String orderNumber; @Valid @NotNull private Address delivery; }
当验证一个订单对象时,它的地址也会被验证。
验证约束
AValidator验证特定类型的对象(图)。当对象被验证时,所有声明的约束都会被验证(从字段、getter、类本身以及如果标记为这样的关联对象)。验证将处理所有约束并返回所有失败项的列表。这对于在用户界面中显示所有错误字段非常有用。
Validator<Address> addressValidator = ...; for (InvalidConstraint<Address> error : addressValidator.validate(address) ) { displayErrorByField(error.getPropertyPath(), error.getMessage()); }
API还允许验证给定的属性而不是整个对象图,以实现更细粒度的验证,甚至在设置值之前。这种情况发生在对象逐渐填充并需要验证时。
//apply the street1 constraints on the value addressValidator.validateValue("street1", "3340 peachtree Rd NE");
还可以验证声明约束的子集而不是所有可用的约束(使用约束组的概念)。这在两种情况下很有用
- 验证逐渐填充的对象图(向导风格UI或用例驱动验证)
- 在另一组约束之前验证一组约束(第二个依赖于第一个或资源成本较高)
组将在未来的文章中介绍。
共享约束元数据
Bean Validation API公开了给定类的所有约束元数据
- 描述了给定元素的约束
- 公开约束属性
- 等
元数据信息对工具(如IDE)和交互式库(如数据库、JavaScript库等)非常有用。
整体方案
JSR 303的目标是成为验证规则的主要运行时检查解决方案和元数据存储库。这种应用程序开发人员、库和需要验证(运行时和元数据)的JSR之间的通用语言将使Java开发人员免于多次约束声明和不兼容的验证实现。
我们特别计划与JSF 2.0、Java Persistence 2.0和WebBeans的专家小组合作,在Java平台级别提供平稳且统一集成。您可以设想您的约束传播到数据库模式、AJAX UI组件,并在Java应用程序的各个级别(表示层、业务层、持久层)进行验证,所有这些都是从同一个声明源:您的域模型。
这篇博客文章仅简要介绍了Bean Validation规范的主要用法和API。我将在后续文章中深入探讨
- 如何编写自己的约束以及为什么这很重要
- 组:定义约束子集,为什么以及如何
- Java领域之外:元数据API
请下载规范草案并给我们反馈。