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 にマッピングするようにしてください。

Bean バリデーション機能

JAX-WS エンドポイントで Bean バリデーションを有効にする最も簡単な方法は、Bean バリデーション機能 をエンドポイントに追加することです。Bean バリデーション機能は、以下のクラスによって実装されます。

org.apache.cxf.validation.BeanValidationFeature
この機能クラスのインスタンスを JAX-WS エンドポイントに追加することにより (Java API または XML の jaxws:endpointjaxws: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>