Menu Close

65.3.3. JAX-RS 2.0 設定

概要

JAX-RS 2.0 設定は、JAX-WS と共通の検証インターセプターを共有する JAX-RS 1.1 とは異なり、JAX-RS 2.0 に固有の専用検証インターセプタークラスに依存します。

Bean バリデーション機能

JAX-RS 2.0 では、以下のクラスによって実装される専用の Bean バリデーション機能があります。

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 バリデーションインボーカー

デフォルト以外のライフサイクルポリシー (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 バリデーションの設定をより細かく制御したい場合は、Bean バリデーション機能を使用する代わりに、JAX-RS インターセプターを個別にインストールできます。以下の JAX-RS インターセプターの 1 つまたは両方を設定します。

org.apache.cxf.validation.JAXRSBeanValidationInInterceptor
JAX-WS 2.0 サーバーエンドポイントにインストールされている場合、検証制約に対してリソースメソッドパラメーターを検証します。検証に失敗した場合は、javax.validation.ConstraintViolationException 例外が発生します。このインターセプターをインストールするには、XML の jaxrs:inInterceptors 子要素を介してエンドポイントに追加します。
org.apache.cxf.validation.JAXRSBeanValidationOutInterceptor
JAX-RS 2.0 エンドポイントにインストールされている場合、検証制約に対して応答値を検証します。検証に失敗した場合は、javax.validation.ConstraintViolationException 例外が発生します。このインターセプターをインストールするには、XML の jaxrs:inInterceptors 子要素を介してエンドポイントに追加します。

Bean バリデーションインターセプターでの JAX-RS 2.0 の設定例

以下の XML の例は、関連する In インターセプター Bean および Out インターセプター Bean を明示的にサーバーエンドポイントに追加して、JAX-RS 2.0 エンドポイントで Bean バリデーション機能を有効にする方法を示しています。

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