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

ブループリント

http://cxf.apache.org/blueprint/jaxws

Spring

http://cxf.apache.org/jaxws

Bean 検証機能

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

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

65.3.2. JAX-RS 設定

概要

ここでは、Blueprint XML または Spring XML で定義される JAX-RS サービスエンドポイントで Bean Validation を有効にする方法を説明します。Bean Validation の実行に使用されるインターセプターは、JAX-WS エンドポイントと JAX-RS 1.1 エンドポイントの両方に共通です (JAX-RS 2.0 エンドポイントは異なるインターセプタークラスを使用します)。

Namespaces

このセクションに記載されている XML の例では、以下の表で示すように、必ず jaxws namespace 接頭辞を Blueprint または Spring のいずれかの適切な namespace にマッピングしてください。

XML 言語Namespace

ブループリント

http://cxf.apache.org/blueprint/jaxws

Spring

http://cxf.apache.org/jaxws

Bean 検証機能

JAX-RS エンドポイントで最も簡単に Bean 検証を有効化する方法は、Bean Validation 機能 をエンドポイントに追加することです。Bean Validation 機能は、以下のクラスによって実装されます。

org.apache.cxf.validation.BeanValidationFeature
この機能クラスのインスタンスを JAX-RS エンドポイントに追加することにより (Java API または XML の jaxrs:serverjaxrs:features 子要素を経由)、エンドポイントで Bean バリデーションを有効にできます。この機能は、着信メッセージデータを検証する In インターセプターと、戻り値を検証する Out インターセプター (インターセプターはデフォルトの設定パラメーターで作成されます) の 2 つのインターセプターをインストールします。

検証例外マッパー

JAX-RS エンドポイントは、検証例外マッパー (HTTP エラー応答にマッピング) を設定する必要もあります。この検証例外マッパーは、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 の例は、commonValidationFeature Bean を JAX-RS 機能として追加し、exceptionMapper Bean を JAX-RS プロバイダーとして追加することで、JAX-RS エンドポイントで Bean バリデーション機能を有効にする方法を示しています。

<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 接頭辞を Blueprint または Spring のいずれかの適切な XML namespace にマップしてください。

一般的な Bean Validation 1.1 インターセプター

Bean バリデーション機能を使用する代わりに、任意で Bean 検証インターセプターをインストールして検証実装をより詳細に制御することができます。JAX-RS は、この目的のために JAX-WS と同じインターセプターを使用します (「一般的な Bean Validation 1.1 インターセプター」 参照)。

Bean Validation インターセプターを使用した JAX-RS 設定の例

以下の XML の例は、関連する In インターセプター Bean と Out インターセプター Bean をサーバーエンドポイントに明示的に追加することで、JAX-RS エンドポイントで Bean Validation 機能を有効にする方法です。

<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-RS2.0 に固有の専用の検証インターセプタークラスに依存しています。

Bean 検証機能

JAX-RS 2.0 の場合には、以下のクラスで実装される専用の Bean Validation 機能があります。

org.apache.cxf.validation.JAXRSBeanValidationFeature
この機能クラスのインスタンスを JAX-RS エンドポイントに追加することにより (Java API または XML の jaxrs:serverjaxrs:features 子要素を経由)、JAX-RS 2.0 サーバーエンドポイントで Bean バリデーションを有効にできます。この機能は、着信メッセージデータを検証する In インターセプターと、戻り値を検証する Out インターセプター (インターセプターはデフォルトの設定パラメーターで作成されます) の 2 つのインターセプターをインストールします。

検証例外マッパー

JAX-RS 2.0 は JAX-RS 1.x と同じ検証例外マッパークラスを使用します。

org.apache.cxf.jaxrs.validation.ValidationExceptionMapper
JAX-RS 2.0 仕様に従って検証例外マッピングを実装します。入力パラメーター検証違反は HTTP ステータスコード 400 Bad Request にマップされます。戻り値の検証違反 (または内部検証違反) は HTTP ステータスコード 500 Internal Server Error にマップされます。

Bean Validation 呼び出し元

デフォルト以外のライフサイクルポリシー (Spring ライフサイクル管理を使用する場合など) で JAX-RS サービスを設定する場合には、エンドポイント設定で jaxrs:invoker 要素を使用して、サービスエンドポイントで org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInvoker インスタンスも登録し、Bean バリデーションが正しく呼び出されるようにする必要があります。

JAX-RS サービスライフサイクル管理の詳細は、「Spring XML でのライフサイクル管理」 を参照してください。

Bean バリデーション機能を使用した JAX-RS 2.0 の設定例

以下の XML の例は、jaxrsValidationFeature Bean を JAX-RS 機能として追加し、exceptionMapper Bean を JAX-RS プロバイダーとして追加することで、JAX-RS 2.0 エンドポイントで 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 接頭辞を Blueprint または Spring のいずれかの適切な XML namespace にマップしてください。

一般的な Bean Validation 1.1 インターセプター

Bean Validation の設定をより詳細に制御しする場合は、Bean Validation 機能を使用する代わりに JAX-RS インターセプターを個別にインストールできます。以下の JAX-RS インターセプターの 1 つまたは両方を設定します。

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 Validation インターセプターを使用した JAX-RS 2.0 の設定例

以下の XML の例は、関連する In インターセプター Bean と Out インターセプター Bean をサーバーエンドポイントに明示的に追加することで、JAX-RS 2.0 エンドポイントで Bean Validation 機能を有効にする方法です。

<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 エンドポイントのコンテキストでメソッドおよびコンストラクターの名前を提供できます。