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