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

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

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

配置 BeanValidationProvider

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

配置 JAXRSParameterNameProvider

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