65.3. Bean Validation の設定
65.3.1. JAX-WS の設定
概要
ここでは、Blueprint XML または Spring XML で定義される JAX-WS サービスエンドポイントで Bean Validation を有効にする方法を説明します。Bean Validation の実行に使用されるインターセプターは、JAX-WS エンドポイントと JAX-RS 1.1 エンドポイントの両方に共通です (JAX-RS 2.0 エンドポイントは異なるインターセプタークラスを使用します)。
Namespaces
このセクションに記載されている XML の例では、以下の表で示すように、必ず jaxws
namespace 接頭辞を Blueprint または Spring のいずれかの適切な namespace にマッピングしてください。
XML 言語 | Namespace |
---|---|
ブループリント | |
Spring |
Bean 検証機能
JAX-WS エンドポイントで最も簡単に Bean 検証を有効化する方法は、Bean Validation 機能 をエンドポイントに追加することです。Bean Validation 機能は、以下のクラスによって実装されます。
org.apache.cxf.validation.BeanValidationFeature
-
この機能クラスのインスタンスを JAX-WS エンドポイントに追加することにより (Java API または XML の
jaxws:endpoint
のjaxws:features
子要素を経由)、エンドポイントで Bean バリデーションを有効にできます。この機能は、着信メッセージデータを検証する In インターセプターと、戻り値を検証する Out インターセプター (インターセプターはデフォルトの設定パラメーターで作成されます) の 2 つのインターセプターをインストールします。
Bean Validation 機能を使用した JAX-WS の設定例
以下の XML の例は、commonValidationFeature
Bean を JAX-WS 機能としてエンドポイントに追加することで、JAX-WS エンドポイントで Bean バリデーション機能を有効にする方法を示しています。
<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
接頭辞を Blueprint または Spring のいずれかの適切な XML namespace にマップしてください。
一般的な Bean Validation 1.1 インターセプター
Bean Validation の設定をより詳細に制御しする場合は、Bean Validation 機能を使用する代わりにインターセプターを個別にインストールできます。Bean Validation 機能の代わりに、以下のインターセプターのいずれかまたは両方を設定できます。
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 Validation インターセプターを使用した JAX-WS の設定例
以下の XML の例は、関連する In インターセプター Bean と Out インターセプター Bean をエンドポイントに明示的に追加することで、JAX-WS エンドポイントで Bean Validation 機能を有効にする方法です。
<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 を使用すると、以下のプロバイダークラスを 1 つ以上上書きできます。
javax.validation.ParameterNameProvider
- メソッドおよびコンストラクターパラメーターの名前を指定します。Java リフレクション API はメソッドパラメーターまたはコンストラクターパラメーターの名前にアクセスできない ため、このクラスが必要になることに注意してください。
javax.validation.spi.ValidationProvider<T>
-
指定された型
T
の Bean バリデーションの実装を提供します。独自のValidationProvider
クラスを実装して、独自のクラスのカスタム検証ルールを定義できます。このメカニズムにより、Bean Validation フレームワークを効果的に拡張することができます。 javax.validation.ValidationProviderResolver
-
ValidationProvider
クラスを検出するメカニズムを実装し、検出されたクラスのリストを返します。デフォルトのリゾルバーは、ValidationProvider
クラスの一覧が含まれる必要があるクラスパス上のMETA-INF/services/javax.validation.spi.ValidationProvider
ファイルを探します。 javax.validation.ValidatorFactory
-
javax.validation.Validator
インスタンスを返すファクトリー。 org.apache.cxf.validation.ValidationConfiguration
- 検証プロバイダーレイヤーからより多くのクラスをオーバーライドできる CXF ラッパークラス。
BeanValidationProvider
をカスタマイズするには、カスタム BeanValidationProvider
インスタンスを検証 In インターセプターのコンストラクターと検証 Out インターセプターのコンストラクターに渡します。以下に例を示します。
<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>