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,如下表所示:

Expand
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,或通过 XML 中的 jaxws:features 子元素的 jaxws:endpoint )添加实例,您可以在端点上启用 bean 验证。此功能安装两个拦截器:即验证传入的消息数据的拦截器;以及验证返回值的 Out 拦截器(其中使用默认配置参数创建拦截器)。

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

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

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

有关 HibernateValidationProviderResolver 类的示例,请参阅 “HibernateValidationProviderResolver 类示例”一节。在 OSGi 环境(Apache Karaf)环境上下文中,只需要配置 beanValidationProvider

注意

请记住,根据上下文,将 jaxws 前缀映射到蓝图或 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"/>
Copy to Clipboard Toggle word wrap

有关 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 实例传递到验证拦截器的构造器,并传输到验证拦截器的结构器。 例如:

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

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,如下表所示:

Expand
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 或通过 jaxrs:features 子元素的 jaxrs:server in XML 中启用 bean 验证),即可在端点上启用 bean 验证。此功能安装两个拦截器:即验证传入的消息数据的拦截器;以及验证返回值的 Out 拦截器(其中使用默认配置参数创建拦截器)。

验证异常映射器

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 示例演示了如何在 JAX-RS 端点中启用 bean 验证功能,方法是添加 commonValidationFeature bean 作为 JAX-RS 功能,并通过添加 exceptionMapper an 作为 JAX-RS 供应商:

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

有关 HibernateValidationProviderResolver 类的示例,请参阅 “HibernateValidationProviderResolver 类示例”一节。在 OSGi 环境(Apache Karaf)环境上下文中,只需要配置 beanValidationProvider

注意

记得根据情况将 jaxrs 前缀映射到蓝图或 Spring 的相应 XML 命名空间。

常见 bean 验证 1.1 拦截器

您可以选择安装 bean 验证拦截器来获取对验证实施的更精细的控制,而不是使用 bean 验证功能。JAX-RS 使用与 JAX-WS 相同的拦截器进行此目的,请参阅 “常见 bean 验证 1.1 拦截器”一节

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

以下 XML 示例演示了如何在 JAX-RS 端点中启用 bean 验证功能,方法是显式将相关的 In interceptor bean 和 Out interceptor 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"/>
Copy to Clipboard Toggle word wrap

有关 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 或通过 jaxrs:features 子元素的 jaxrs:server in XML 中),您可以对 JAX-RS 2.0 服务器端点启用 bean 验证。此功能安装两个拦截器:即验证传入的消息数据的拦截器;以及验证返回值的 Out 拦截器(其中使用默认配置参数创建拦截器)。

验证异常映射器

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

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 instance- using the endpoint configuration- invoker 元素,以确保正确调用验证。

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

有关 HibernateValidationProviderResolver 类的示例,请参阅 “HibernateValidationProviderResolver 类示例”一节。在 OSGi 环境(Apache Karaf)环境上下文中,只需要配置 beanValidationProvider

注意

记得根据情况将 jaxrs 前缀映射到蓝图或 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"/>
Copy to Clipboard Toggle word wrap

有关 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 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

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

Theme

© 2025 Red Hat