第 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 类:

// 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 ) {
        // ...
    }
}
Copy to Clipboard

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 文件中添加以下核心依赖项:

<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>
Copy to Clipboard
注意

javax.el/javax.el-apiorg.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>
Copy to Clipboard

在 OSGi 环境中解析验证供应商

解决验证提供程序的默认机制需要扫描类路径以查找提供程序资源。但是,如果 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"/>
Copy to Clipboard

这里的 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());
    }
}
Copy to Clipboard

当您在 Maven 构建系统中构建上述类(配置为使用 Maven bundle 插件)时,您的应用将在部署时连接到 Hibernate 验证捆绑包(假设您已将 Hibernate 验证捆绑包部署到 OSGi 容器中)。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat