第 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 ) {
        // ...
    }
}

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>
注意

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>

解决 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 类示例

以下代码示例演示了如何定义可解析 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());
    }
}

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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.