第 65 章 bean Validation
摘要
Bean 验证是一个 Java 标准,您可以通过将 Java 注解添加到服务类或接口来定义运行时限制。Apache CXF 使用拦截器将此功能与 Web 服务方法调用集成。
65.1. 简介
概述
bean Validation 1.1(JSR-349)- 这是原始 Bean 验证 1.0(JSR-303)标准的演进,您可以在运行时声明可以检查的限制,可以使用 Java 注解来声明可进行检查的约束。您可以使用注解对 Java 代码的以下部分定义限制:
- Bean 类中的字段。
- 方法和构造器参数.
- 方法返回值。
注解的类示例
以下示例显示了带有某些标准 bean 验证限制的 Java 类:
// Java import javax.validation.constraints.NotNull; import javax.validation.constraints.Max; import javax.validation.Valid; ... public class Person { @NotNull private String firstName; @NotNull private String lastName; @Valid @NotNull private Person boss; public @NotNull String saveItem( @Valid @NotNull Person person, @Max( 23 ) BigDecimal age ) { // ... } }
bean 验证或 schema 验证?
在某些方面,bean 验证和 schema 验证非常类似。使用 XML 模式配置端点是在 Web 服务端点上在运行时验证消息的一种良好方法。XML 模式可以检查许多与传入和传出消息验证相同的限制。但是,对于以下一个或多个原因,bean 验证有时会是一个有用的替代选择:
- Bean 验证可让您独立于 XML 模式定义限制(例如,在代码第一服务开发时很有用)。
- 如果您当前的 XML 模式太小,可以使用 bean 验证来定义更严格的限制。
- an 验证可让您定义自定义约束,这可能无法使用 XML 模式语言进行定义。
依赖项
Bean Validation 1.1(JSR-349)标准仅定义 API,而非实施。因此,必须在两个部分提供依赖项:
- 核心依赖项- 提供 bean 验证 1.1 API、Java 统一表达式语言 API 和实施。
- Hibernate 验证器依赖项- 提供 bean 验证 1.1 的实施。
核心依赖项
要使用 bean 验证,您必须在项目的 Maven pom.xml
文件中添加以下核心依赖项:
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <!-- use 3.0-b02 version for Java 6 --> <version>3.0.0</version> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <!-- use 3.0-b01 version for Java 6 --> <version>3.0.0</version> </dependency>
javax.el/javax.el-api
和 org.glassfish/javax.el
依赖项提供了 Java 统一表达式语言的 API 和实施。此表达式语言由 bean 验证在内部使用,但在应用程序编程级别上并不重要。
Hibernate 验证器依赖项
要使用 bean 验证的 Hibernate Validator 实现,您必须将以下额外依赖项添加到项目的 Maven pom.xml
文件中:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.0.3.Final</version> </dependency>
解决 OSGi 环境中的验证供应商
解决验证提供程序的默认机制涉及扫描 classpath 来查找提供程序资源。然而,如果 OSGi(Apache Karaf)环境不起作用,这种机制 不起作用,因为验证提供程序(例如,Hibernate 验证器)被打包到单独的捆绑包中,因此您的应用程序类路径中不可用。在 OSGi 上下文中,需要将 Hibernate 验证器与您的应用程序捆绑包相连接,并且 OSGi 需要一些帮助才能成功完成此操作。
在 OSGi 中显式配置验证供应商
在 OSGi 的上下文中,您需要明确配置验证供应商,而不必依赖于自动发现。例如,如果您使用通用验证功能(请参阅 “bean 验证功能”一节)来启用 bean 验证,则必须使用验证供应商进行配置,如下所示:
<bean id="commonValidationFeature" class="org.apache.cxf.validation.BeanValidationFeature"> <property name="provider" ref="beanValidationProvider"/> </bean> <bean id="beanValidationProvider" class="org.apache.cxf.validation.BeanValidationProvider"> <constructor-arg ref="validationProviderResolver"/> </bean> <bean id="validationProviderResolver" class="org.example.HibernateValidationProviderResolver"/>
其中 HibernateValidationProviderResolver
是一个自定义类,它会打包 Hibernate 验证提供程序。
HibernateValidationProviderResolver 类示例
以下代码示例演示了如何定义自定义 HibernateValidationProviderResolver
,它可解析 Hibernate 验证器:
// Java package org.example; import static java.util.Collections.singletonList; import org.hibernate.validator.HibernateValidator; import javax.validation.ValidationProviderResolver; import java.util.List; /** * OSGi-friendly implementation of {@code javax.validation.ValidationProviderResolver} returning * {@code org.hibernate.validator.HibernateValidator} instance. * */ public class HibernateValidationProviderResolver implements ValidationProviderResolver { @Override public List getValidationProviders() { return singletonList(new HibernateValidator()); } }
当您在 Maven 构建系统中构建前面的类时,配置为使用 Maven bundle 插件时,您的应用程序将会在部署时附加到 Hibernate 验证捆绑包(假设您已将 Hibernate 验证捆绑包部署到 OSGi 容器)。