Red Hat Training
A Red Hat training course is available for Red Hat Fuse
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 |
|---|---|
| ブループリント | |
| Spring |
Bean 検証機能
JAX-RS エンドポイントで最も簡単に Bean 検証を有効化する方法は、Bean Validation 機能 をエンドポイントに追加することです。Bean Validation 機能は、以下のクラスによって実装されます。
org.apache.cxf.validation.BeanValidationFeature-
この機能クラスのインスタンスを JAX-RS エンドポイントに追加することにより (Java API または XML の
jaxrs:serverのjaxrs: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 インスタンスを検証インターセプターに注入できます。