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 中的
子元素),您可以在端点上启用 bean 验证。此功能安装两个拦截器:一个拦截器验证传入的消息数据;以及验证返回值的 Out 拦截器(其中,拦截器会使用默认配置参数创建)。jaxws:features
带有 bean 验证功能的 JAX-WS 配置示例 复制链接链接已复制到粘贴板!
以下 XML 示例演示了如何在 JAX-WS 端点中启用 bean 验证功能,方法是在端点中添加 commonValidationFeature bean 作为 JAX-WS 功能:
有关 HibernateValidationProviderResolver 类的示例实现,请参阅 “HibernateValidationProviderResolver 类示例”一节。只需要在 OSGi 环境(Apache Karaf)环境中配置 beanValidationProvider。
根据具体情况,请记住将 jaxws 前缀映射到蓝图或 Spring 的相应 XML 命名空间。
Common 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 示例演示了如何在 JAX-WS 端点中启用 bean 验证功能,方法是明确将相关的 In 拦截器 bean 和 Out 拦截器 bean 添加到端点:
有关 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 实例传递到验证参与拦截器的构造器,并传递给验证传出拦截器的构造器。 例如: