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) | |
Spring |
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>
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) | |
Spring |
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"/>
有关 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"/>
有关 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"/>
有关 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 端点上下文中提供方法和构造器参数。