65.3. 配置 Bean 验证


65.3.1. JAX-WS 配置

概述

本节论述了如何在 JAX-WS 服务端点中启用 bean 验证,该端点在 Blueprint XML 或 Spring XML 中定义。用于执行 bean 验证的拦截器常见于 JAX-WS 端点和 JAX-RS 1.1 端点(JAX-RS 2.0 端点使用不同的拦截器类)。

命名空间

在本节中显示的 XML 示例中,您必须记住将 jaxws 命名空间前缀映射到适当的命名空间,可以是 Blueprint 或 Spring,如下表所示:

XML 语言命名空间

蓝图(Blueprint)

http://cxf.apache.org/blueprint/jaxws

Spring

http://cxf.apache.org/jaxws

Bean 验证功能

在 JAX-WS 端点上启用 bean 验证的最简单方法是将 bean 验证功能 添加到端点。bean 验证功能由以下类实现:

org.apache.cxf.validation.BeanValidationFeature
通过将此功能类的实例添加到 JAX-WS 端点(通过 Java API 或通过 jaxws:features 子元素的 jaxws:endpoint 子元素在端点上启用 bean 验证),您可以在端点上启用 bean 验证。这个功能会安装两个拦截器:一个用来验证传入的消息数据的 In interceptor,以及一个验证返回值的 Out interceptor (使用默认配置参数创建拦截器)。

带有 bean 验证功能的 JAX-WS 配置示例

以下 XML 示例演示了如何通过将 commonValidationFeature bean 作为 JAX-WS 功能添加到端点,在 JAX-WS 端点中启用 bean 验证功能:

<jaxws:endpoint xmlns:s="http://bookworld.com"
                serviceName="s:BookWorld"
                endpointName="s:BookWorldPort"
                implementor="#bookWorldValidation"
                address="/bwsoap">
    <jaxws:features>
        <ref bean="commonValidationFeature" />
    </jaxws:features>
</jaxws:endpoint>

<bean id="bookWorldValidation" class="org.apache.cxf.systest.jaxrs.validation.spring.BookWorldImpl"/>

<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 类的示例实现,请参阅 “HibernateValidationProviderResolver 类示例”一节。只需要在 OSGi 环境(Apache Karaf)环境中配置 beanValidationProvider

注意

请记住,根据上下文,将 jaxws 前缀映射到 Blueprint 或 Spring 的适当 XML 命名空间。

通用 Bean 验证 1.1 拦截器

如果要对 bean 验证的配置具有更精细的控制,您可以单独安装拦截器,而不使用 bean 验证功能。要代替 bean 验证功能,您可以配置以下一个或多个拦截器:

org.apache.cxf.validation.BeanValidationInInterceptor
在 JAX-WS (或 JAX-RS 1.1)端点中安装时,根据验证约束验证资源方法参数。如果验证失败,请引发 javax.validation.ConstraintViolationException 异常。要安装此拦截器,请通过 XML 中的 jaxws:inInterceptors 子元素(或 XML 中的 jaxrs:inInterceptors 子元素)将其添加到端点中。
org.apache.cxf.validation.BeanValidationOutInterceptor
在 JAX-WS (或 JAX-RS 1.1)端点中安装时,根据验证约束验证响应值。如果验证失败,请引发 javax.validation.ConstraintViolationException 异常。要安装此拦截器,请通过 XML 中的 jaxws:outInterceptors 子元素(或 XML 中的 jaxrs:outInterceptors 子元素)将其添加到端点中。

带有 bean 验证拦截器的 JAX-WS 配置示例

以下 XML 示例演示了如何通过将相关的 In interceptor bean 和 Out interceptor bean 添加到端点,在 JAX-WS 端点中启用 bean 验证功能:

<jaxws:endpoint xmlns:s="http://bookworld.com"
                serviceName="s:BookWorld"
                endpointName="s:BookWorldPort"
                implementor="#bookWorldValidation"
                address="/bwsoap">
    <jaxws:inInterceptors>
        <ref bean="validationInInterceptor" />
    </jaxws:inInterceptors>

    <jaxws:outInterceptors>
        <ref bean="validationOutInterceptor" />
    </jaxws:outInterceptors>
</jaxws:endpoint>

<bean id="bookWorldValidation" class="org.apache.cxf.systest.jaxrs.validation.spring.BookWorldImpl"/>

<bean id="validationInInterceptor" class="org.apache.cxf.validation.BeanValidationInInterceptor">
    <property name="provider" ref="beanValidationProvider"/>
</bean>
<bean id="validationOutInterceptor" class="org.apache.cxf.validation.BeanValidationOutInterceptor">
    <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 类的示例实现,请参阅 “HibernateValidationProviderResolver 类示例”一节。只需要在 OSGi 环境(Apache Karaf)环境中配置 beanValidationProvider

配置 BeanValidationProvider

org.apache.cxf.validation.BeanValidationProvider 是一个简单的打包程序类,它打包了 bean 验证实施(验证提供程序)。通过覆盖默认 BeanValidationProvider 类,您可以自定义 bean 验证的实现。BeanValidationProvider bean 允许您覆盖以下一个或多个供应商类:

javax.validation.ParameterNameProvider
为方法和构造器参数提供名称。请注意,需要这个类,因为 Java 反映 API 为您提供方法参数或构造器参数的名称。
javax.validation.spi.ValidationProvider<T>
为指定类型 T 提供 bean 验证的实现。通过实施自己的 ValidationProvider 类,您可以为您自己的类定义自定义验证规则。这种机制可让您有效地扩展 bean 验证框架。
javax.validation.ValidationProviderResolver
实施用于发现 ValidationProvider 类的机制,并返回已发现类的列表。默认解析器在 classpath 上查找 META-INF/services/javax.validation.spi.ValidationProvider 文件,该文件应包含 ValidationProvider 类列表。
javax.validation.ValidatorFactory
返回 javax.validation.Validator 实例的工厂。
org.apache.cxf.validation.ValidationConfiguration
CXF 打包程序类,可让您覆盖验证供应商层中的更多类。

要自定义 BeanValidationProvider,请将自定义 BeanValidationProvider 实例传递给验证机构以及验证 Out interceptor 的构造器。例如:

<bean id="validationProvider" class="org.apache.cxf.validation.BeanValidationProvider" />

<bean id="validationInInterceptor" class="org.apache.cxf.validation.BeanValidationInInterceptor">
    <property name="provider" ref="validationProvider" />
</bean>

<bean id="validationOutInterceptor" class="org.apache.cxf.validation.BeanValidationOutInterceptor">
    <property name="provider" ref="validationProvider" />
</bean>

65.3.2. JAX-RS 配置

概述

本节论述了如何在 JAX-RS 服务端点中启用 bean 验证,该端点在 Blueprint XML 或 Spring XML 中定义。用于执行 bean 验证的拦截器常见于 JAX-WS 端点和 JAX-RS 1.1 端点(JAX-RS 2.0 端点使用不同的拦截器类)。

命名空间

在本节中显示的 XML 示例中,您必须记住将 jaxws 命名空间前缀映射到适当的命名空间,可以是 Blueprint 或 Spring,如下表所示:

XML 语言命名空间

蓝图(Blueprint)

http://cxf.apache.org/blueprint/jaxws

Spring

http://cxf.apache.org/jaxws

Bean 验证功能

在 JAX-RS 端点上启用 bean 验证的最简单方法是向端点添加 bean 验证功能。bean 验证功能由以下类实现:

org.apache.cxf.validation.BeanValidationFeature
通过将此功能类的实例添加到 JAX-RS 端点(通过 Java API 或通过 XML 中的 jaxrs:serverjaxrs:features 子元素),您可以在端点上启用 bean 验证。这个功能会安装两个拦截器:一个用来验证传入的消息数据的 In interceptor,以及一个验证返回值的 Out interceptor (使用默认配置参数创建拦截器)。

验证例外映射器

JAX-RS 端点还需要配置 验证异常映射器,它负责将验证例外映射到 HTTP 错误响应。以下类为 JAX-RS 实施验证异常映射:

org.apache.cxf.jaxrs.validation.ValidationExceptionMapper
根据 JAX-RS 2.0 规范实施验证异常映射:任何输入参数验证违反情况都会映射到 HTTP 状态代码 400 Bad Request ;以及任何返回值验证违反(或内部验证违反)映射到 HTTP 状态代码 500 Internal Server Error

JAX-RS 配置示例

以下 XML 示例演示了如何通过将 commonValidationFeature bean 添加为 JAX-RS 功能,并通过将 exceptionMapper bean 添加为 JAX-RS 提供程序,在 JAX-RS 端点中启用 bean 验证功能:

<jaxrs:server address="/bwrest">
    <jaxrs:serviceBeans>
        <ref bean="bookWorldValidation"/>
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <ref bean="exceptionMapper"/>
    </jaxrs:providers>
    <jaxrs:features>
        <ref bean="commonValidationFeature" />
    </jaxrs:features>
</jaxrs:server>

<bean id="bookWorldValidation" class="org.apache.cxf.systest.jaxrs.validation.spring.BookWorldImpl"/>
<beanid="exceptionMapper"class="org.apache.cxf.jaxrs.validation.ValidationExceptionMapper"/>

<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 类的示例实现,请参阅 “HibernateValidationProviderResolver 类示例”一节。只需要在 OSGi 环境(Apache Karaf)环境中配置 beanValidationProvider

注意

请记住,根据上下文,将 jaxrs 前缀映射到 Blueprint 或 Spring 的适当 XML 命名空间。

通用 Bean 验证 1.1 拦截器

您可以选择安装 bean 验证拦截器来更精细地控制验证实现,而不使用 bean 验证功能。JAX-RS 使用与 JAX-WS 相同的拦截器来实现此目的,请参阅 “通用 Bean 验证 1.1 拦截器”一节

带有 bean 验证拦截器的 JAX-RS 配置示例

以下 XML 示例演示了如何通过将相关的 In interceptor bean 和 Out interceptor bean 添加到服务器端点,在 JAX-RS 端点中启用 bean 验证功能:

<jaxrs:server address="/">
    <jaxrs:inInterceptors>
        <ref bean="validationInInterceptor" />
    </jaxrs:inInterceptors>

    <jaxrs:outInterceptors>
        <ref bean="validationOutInterceptor" />
    </jaxrs:outInterceptors>

    <jaxrs:serviceBeans>
    ...
    </jaxrs:serviceBeans>

    <jaxrs:providers>
        <ref bean="exceptionMapper"/>
    </jaxrs:providers>
</jaxrs:server>

<bean id="exceptionMapper" class="org.apache.cxf.jaxrs.validation.ValidationExceptionMapper"/>

<bean id="validationInInterceptor" class="org.apache.cxf.validation.BeanValidationInInterceptor">
    <property name="provider" ref="beanValidationProvider" />
</bean>

<bean id="validationOutInterceptor" class="org.apache.cxf.validation.BeanValidationOutInterceptor">
    <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 类的示例实现,请参阅 “HibernateValidationProviderResolver 类示例”一节。只需要在 OSGi 环境(Apache Karaf)环境中配置 beanValidationProvider

配置 BeanValidationProvider

您可以将自定义 BeanValidationProvider 实例注入验证拦截器,如 “配置 BeanValidationProvider”一节 所述。

65.3.3. JAX-RS 2.0 配置

概述

与 JAX-RS 1.1 (与 JAX-WS 共享通用验证拦截器)不同,JAX-RS 2.0 配置依赖于特定于 JAX-RS 2.0 的专用验证拦截器类。

Bean 验证功能

对于 JAX-RS 2.0,有一个专用的 bean 验证功能,它由以下类实施:

org.apache.cxf.validation.JAXRSBeanValidationFeature
通过将此功能类的实例添加到 JAX-RS 端点(通过 Java API 或通过 XML 中的 jaxrs:serverjaxrs:features 子元素),您可以在 JAX-RS 2.0 服务器端点上启用 bean 验证。这个功能会安装两个拦截器:一个用来验证传入的消息数据的 In interceptor,以及一个验证返回值的 Out interceptor (使用默认配置参数创建拦截器)。

验证例外映射器

JAX-RS 2.0 使用与 JAX-RS 1.x 相同的验证异常映射器类:

org.apache.cxf.jaxrs.validation.ValidationExceptionMapper
根据 JAX-RS 2.0 规范实施验证异常映射:任何输入参数验证违反情况都会映射到 HTTP 状态代码 400 Bad Request ;以及任何返回值验证违反(或内部验证违反)映射到 HTTP 状态代码 500 Internal Server Error

Bean 验证调用器

如果您使用非默认生命周期策略(例如,使用 Spring 生命周期管理)配置 JAX-RS 服务,您还应注册 org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInvoker 实例,使用带有服务端点的端点配置中的 jaxrs:invoker 元素,以确保正确调用 bean 验证。

有关 JAX-RS 服务生命周期管理的详情,请参考 “Spring XML 中的生命周期管理”一节

带有 bean 验证功能的 JAX-RS 2.0 配置示例

以下 XML 示例演示了如何通过将 jaxrsValidationFeature bean 添加为 JAX-RS 功能,并通过将 exceptionMapper bean 添加为 JAX-RS 提供程序,在 JAX-RS 端点中启用 bean 验证功能:

<jaxrs:server address="/">
    <jaxrs:serviceBeans>
    ...
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <ref bean="exceptionMapper"/>
    </jaxrs:providers>
    <jaxrs:features>
        <ref bean="jaxrsValidationFeature" />
    </jaxrs:features>
</jaxrs:server>

<bean id="exceptionMapper" class="org.apache.cxf.jaxrs.validation.ValidationExceptionMapper"/>
<bean id="jaxrsValidationFeature" class="org.apache.cxf.validation.JAXRSBeanValidationFeature">
    <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 类的示例实现,请参阅 “HibernateValidationProviderResolver 类示例”一节。只需要在 OSGi 环境(Apache Karaf)环境中配置 beanValidationProvider

注意

请记住,根据上下文,将 jaxrs 前缀映射到 Blueprint 或 Spring 的适当 XML 命名空间。

通用 Bean 验证 1.1 拦截器

如果要对 bean 验证的配置具有更精细的控制,您可以单独安装 JAX-RS 拦截器,而不使用 bean 验证功能。配置以下 JAX-RS 拦截器中的一个或两个:

org.apache.cxf.validation.JAXRSBeanValidationInInterceptor
在 JAX-RS 2.0 服务器端点中安装时,会根据验证约束验证资源方法参数。如果验证失败,请引发 javax.validation.ConstraintViolationException 异常。要安装此拦截器,请通过 XML 中的 jaxrs:inInterceptors 子元素将其添加到端点。
org.apache.cxf.validation.JAXRSBeanValidationOutInterceptor
在 JAX-RS 2.0 端点中安装时,根据验证约束验证响应值。如果验证失败,请引发 javax.validation.ConstraintViolationException 异常。要安装此拦截器,请通过 XML 中的 jaxrs:inInterceptors 子元素将其添加到端点。

带有 bean 验证拦截器的 JAX-RS 2.0 配置示例

以下 XML 示例演示了如何通过显式将相关的 In interceptor bean 和 Out interceptor bean 添加到服务器端点,在 JAX-RS 2.0 端点中启用 bean 验证功能:

<jaxrs:server address="/">
    <jaxrs:inInterceptors>
        <ref bean="validationInInterceptor" />
    </jaxrs:inInterceptors>

    <jaxrs:outInterceptors>
        <ref bean="validationOutInterceptor" />
    </jaxrs:outInterceptors>

    <jaxrs:serviceBeans>
    ...
    </jaxrs:serviceBeans>

    <jaxrs:providers>
        <ref bean="exceptionMapper"/>
    </jaxrs:providers>
</jaxrs:server>

<bean id="exceptionMapper" class="org.apache.cxf.jaxrs.validation.ValidationExceptionMapper"/>

<bean id="validationInInterceptor" class="org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInInterceptor">
    <property name="provider" ref="beanValidationProvider" />
</bean>

<bean id="validationOutInterceptor" class="org.apache.cxf.jaxrs.validation.JAXRSBeanValidationOutInterceptor">
    <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 类的示例实现,请参阅 “HibernateValidationProviderResolver 类示例”一节。只需要在 OSGi 环境(Apache Karaf)环境中配置 beanValidationProvider

配置 BeanValidationProvider

您可以将自定义 BeanValidationProvider 实例注入验证拦截器,如 “配置 BeanValidationProvider”一节 所述。

配置 JAXRSParameterNameProvider

org.apache.cxf.jaxrs.validation.JAXRSParameterNameProvider 类是 javax.validation.ParameterNameProvider 接口的实现,可用于在 JAX-RS 2.0 端点上下文中提供方法和构造参数的名称。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.