将验证视为业务逻辑有利有弊,Spring 为验证(和数据绑定)提供了一种设计,并不排斥其中任何一种。具体来说,验证不应该与 Web 层捆绑在一起,应该易于本地化,而且应该可以插入任何可用的验证器。考虑到这些问题,Spring 提供了一个验证器契约,它既是基本的,又可以在应用程序的每一层中使用。
数据绑定对于让用户输入动态地绑定到应用程序的领域模型(或你用来处理用户输入的任何对象)非常有用。Spring 提供了一个被恰当地命名为 DataBinder 的工具来实现这一目的。验证器和 DataBinder 组成了验证包,它主要用于但不限于 Web 层。
BeanWrapper 是 Spring 框架的一个基本概念,在很多地方都会用到。然而,你可能不需要直接使用BeanWrapper。然而,由于这是参考文档,我们觉得可能需要做一些解释。我们在本章中解释了BeanWrapper,因为如果你要使用它,你很可能是在试图将数据绑定到对象上的时候。
Spring 的 DataBinder 和低级别的 BeanWrapper 都使用 PropertyEditorSupport 实现来解析和格式化属性值。PropertyEditor 和 PropertyEditorSupport 类型是 JavaBeans 规范的一部分,在本章也有解释。Spring 3 引入了 core.convert
包,它提供了一个通用的类型转换工具,以及一个用于格式化 UI 字段值的更高层次的 format
包。你可以使用这些包作为 PropertyEditorSupport 实现的更简单的替代品。本章也对它们进行了讨论。
Spring 通过设置基础设施和 Spring 自己的 Validator 合约的适配器来支持 Java Bean 验证。应用程序可以在全局范围内启用一次 Bean Validation,如 Java Bean Validation 中所述,并专门使用它来满足所有验证需求。在 Web 层,应用程序可以进一步为每个 DataBinder 注册控制器本地的 Spring 验证器实例,如 配置 DataBinder 中所述,这对于插入自定义验证逻辑非常有用。