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,或通过 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"/>

有关 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"/>

有关 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>