Menu Close
50.2. WebApplicationException 例外を使用したレポート
errors indexterm:[WebApplicationException]
概要
JAX-RS API には WebApplicationException ランタイム例外が導入されました。これにより、リソースメソッドが RESTful クライアントが消費するのに適した例外を簡単に作成できるようになりました。WebApplicationException 例外には、リクエスト元に返されるエンティティーボディーを定義する Response
オブジェクトを含めることができます。また、エンティティーボディーが指定されていない場合に、クライアントに返される HTTP ステータスコードを指定するメカニズムも提供します。
簡単な例外の作成
WebApplicationException 例外を作成する最も簡単な方法は、引数のないコンストラクターを使用するか、WebApplicationException 例外で元の例外をラップするコンストラクターを使用することです。どちらのコンストラクターも、空のレスポンスを持つ WebApplicationException を作成します。
これらのコンストラクターのいずれかによって作成された例外がスローされると、ランタイムはエンティティーボディーが空でステータスコードが 500 Server Error
のレスポンスを返します。
クライアントに返されるステータスコードの設定
500
以外のエラーコードを返す場合は、ステータスを指定できるようにする 4 つの WebApplicationException コンストラクターのいずれかを使用できます。例50.1「ステータスコードを使用した WebApplicationException の作成」 に記載されているコンストラクターの 2 つは、リターンステータスを整数として取ります。
例50.1 ステータスコードを使用した WebApplicationException の作成
WebApplicationException
int
status
WebApplicationException
java.lang.Throwable
cause
int
status
例50.2「ステータスコードを使用した WebApplicationException の作成」 に記載されている他の 2 つは、レスポンスステータスを Response.Status
のインスタンスとしてし取ります。
例50.2 ステータスコードを使用した WebApplicationException の作成
WebApplicationException
javax.ws.rs.core.Response.Status
status
WebApplicationException
java.lang.Throwable
cause
javax.ws.rs.core.Response.Status
status
これらのコンストラクターのいずれかによって作成された例外がスローされると、ランタイムは空のエンティティーボディーと指定されたステータスコードが含まれるレスポンスを返します。
エンティティーボディーの提供
例外とともにメッセージを送信する場合は、Response
オブジェクトを取る WebApplicationException コンストラクターのいずれかを使用することができます。ランタイムは、Response
オブジェクトを使用してクライアントに送信される応答を作成します。応答に保存されるエンティティーはメッセージのエンティティーボディーにマッピングされ、応答のステータスフィールドはメッセージの HTTP ステータスにマッピングされます。
例50.3「例外のあるメッセージの送信」 は、例外の理由を含むテキストメッセージをクライアントに返すコードを示しています。HTTP メッセージのステータスは 409 Conflict
に設定されます。
例50.3 例外のあるメッセージの送信
import javax.ws.rs.core.Response; import javax.ws.rs.WebApplicationException; import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl; ... ResponseBuilderImpl builder = new ResponseBuilderImpl(); builder.status(Response.Status.CONFLICT); builder.entity("The requested resource is conflicted."); Response response = builder.build(); throw WebApplicationException(response);
汎用例外の拡張
WebApplicationException 例外を拡張することは可能です。これにより、カスタム例外を作成し、ボイラープレートコードをいくつか排除できます。
例50.4「WebApplicationException の拡張」 は、例50.3「例外のあるメッセージの送信」 のコードと同様の応答を作成する新しい例外を示しています。
例50.4 WebApplicationException の拡張
public class ConflicteddException extends WebApplicationException { public ConflictedException(String message) { ResponseBuilderImpl builder = new ResponseBuilderImpl(); builder.status(Response.Status.CONFLICT); builder.entity(message); super(builder.build()); } } ... throw ConflictedException("The requested resource is conflicted.");