Red Hat Training
A Red Hat training course is available for Red Hat Fuse
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 中的
子元素),您可以在 JAX-RS 2.0 服务器端点上启用 bean 验证。此功能安装两个拦截器:一个拦截器验证传入的消息数据;以及验证返回值的 Out 拦截器(其中,拦截器会使用默认配置参数创建)。jaxrs:features
验证异常映射程序
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 示例演示了如何在 JAX-RS 2.0 端点中启用 bean 验证功能,方法是将 jaxrsValidationFeature bean 添加为 JAX-RS 功能,并通过将 exceptionMapper bean 添加为 JAX-RS 提供程序:
<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 命名空间。
Common 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 示例演示了如何在 JAX-RS 2.0 端点中启用 bean 验证功能,方法是明确将相关的 In 拦截器 bean 和 Out 拦截器 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 端点的上下文中为方法和构造器参数提供名称。