第 65 章 Bean Validation
摘要
Bean 验证是一种 Java 标准,您可以通过将 Java 注解添加到服务类或接口来定义运行时约束。Apache CXF 使用拦截器将此功能与 Web 服务方法调用集成。
65.1. 简介 复制链接链接已复制到粘贴板!
概述 复制链接链接已复制到粘贴板!
Bean Validation 1.1 (JSR-349)- 这是原始 Bean Validation 1.0 (JSR-303)标准的演进,您可以使用 Java 注释来声明运行时可以检查的约束。您可以使用注解来定义 Java 代码以下部分的约束:
- Bean 类中的字段。
- 方法和构造器参数.
- 方法返回值。
注解类示例 复制链接链接已复制到粘贴板!
以下示例显示了一个带有一些标准 bean 验证限制的 Java 类:
Bean 验证或架构验证? 复制链接链接已复制到粘贴板!
在一些方面,bean 验证和模式验证过程非常相似。使用 XML 模式配置端点是在 Web 服务端点运行时验证消息的好方法。XML 模式可以检查许多与传入和传出消息上的 bean 验证相同的约束。然而,出于以下一个或多个原因,bean 验证有时是有用的替代选择:
- Bean 验证可让您独立于 XML 模式定义约束(例如,如果 code-first 服务开发,这很有用)。
- 如果您的当前 XML 模式过拉x,您可以使用 bean 验证来定义严格的限制。
- Bean 验证可让您定义自定义约束,这可能无法使用 XML 模式语言进行定义。
依赖项 复制链接链接已复制到粘贴板!
Bean Validation 1.1 (JSR-349)标准仅定义 API,而非实施。因此,依赖项必须在两个部分中提供:
- 核心依赖项- 提供 bean 验证 1.1 API、Java 统一表达式语言 API 和实施。
- Hibernate Validator 依赖项- 提供 bean 验证 1.1 的实现。
内核依赖项 复制链接链接已复制到粘贴板!
要使用 bean 验证,您必须在项目的 Maven pom.xml
文件中添加以下核心依赖项:
javax.el/javax.el-api
和 org.glassfish/javax.el
依赖项提供 Java 统一表达式语言的 API 和实施。此表达式语言由 bean 验证在内部使用,但对应用编程级别并不重要。
Hibernate Validator 依赖项 复制链接链接已复制到粘贴板!
要使用 bean 验证的 Hibernate 验证功能,您必须在项目的 Maven pom.xml
文件中添加以下额外依赖项:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.0.3.Final</version> </dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.0.3.Final</version>
</dependency>
在 OSGi 环境中解析验证供应商 复制链接链接已复制到粘贴板!
解决验证提供程序的默认机制需要扫描类路径以查找提供程序资源。但是,如果 OSGi (Apache Karaf)环境,这种机制无法正常工作,因为验证供应商(例如,Hibernate 验证器)打包在单独的捆绑包中,因此不会在您的应用程序类路径中自动可用。在 OSGi 的上下文中,Hibernate 验证器需要与您的应用程序捆绑包相连接,且 OSGi 需要一些帮助才能成功完成此操作。
在 OSGi 中明确配置验证供应商 复制链接链接已复制到粘贴板!
在 OSGi 上下文中,您需要明确配置验证供应商,而不依赖于自动发现。例如,如果您使用通用验证功能(请参阅 “Bean 验证功能”一节)启用 Bean 验证功能,您必须使用验证供应商进行配置,如下所示:
这里的 HibernateValidationProviderResolver
是一个自定义类,它嵌套 Hibernate 验证供应商。
HibernateValidationProviderResolver 类示例 复制链接链接已复制到粘贴板!
以下代码示例演示了如何定义自定义 HibernateValidationProviderResolver
,它解决了 Hibernate 验证器:
当您在 Maven 构建系统中构建上述类(配置为使用 Maven bundle 插件)时,您的应用将在部署时连接到 Hibernate 验证捆绑包(假设您已将 Hibernate 验证捆绑包部署到 OSGi 容器中)。