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