第 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 Toggle word wrap

Bean 验证或模式验证?

在某些情况下,bean 验证和模式验证非常相似。使用 XML 模式配置端点是建立良好的方法,可在 Web 服务端点上在运行时验证消息。XML 模式可以检查与传入和传出消息上的 bean 验证相同的限制。但是,因为以下一个或多个原因,bean 验证有时可能是一个有用的替代方案:

  • Bean 验证可让您独立于 XML 模式定义约束(例如,在代码优先服务开发时很有用)。
  • 如果您的当前 XML 模式太 lax,您可以使用 bean 验证来定义严格的限制。
  • Bean 验证可让您定义自定义约束,这可能无法使用 XML 模式语言定义。

依赖项

Bean Validation 1.1 (nouveau-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 Toggle word wrap
注意

javax.el/javax.el-apiorg.glassfish/javax.el 依赖项提供了 Java 统一表达式语言的 API 和实现。此表达式语言由 bean 验证在内部使用,但在应用编程级别并不重要。

Hibernate Validator 依赖项

要使用 bean 验证的 Hibernate Validator 实现,您必须将以下额外依赖项添加到项目的 Maven pom.xml 文件中:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.0.3.Final</version>
</dependency>
Copy to Clipboard Toggle word wrap

解决 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"/>
Copy to Clipboard Toggle word wrap

其中 HibernateValidationProviderResolver 是一个自定义类,用于打包 Hibernate 验证提供程序。

HibernateValidationProviderResolver 类示例

以下代码示例演示了如何定义可解析 Hibernate 验证器的自定义 HibernateValidationProviderResolver

// 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 Toggle word wrap

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat