这篇博客文章是关于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

请下载规范草案并给我们反馈。


回到顶部