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

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

javax.el/javax.el-apiorg.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>
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 类示例

以下代码示例演示了如何定义自定义 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 Toggle word wrap

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat