17.1.9 メディアタイプ宣言
ConsumesアノテーションとProducesアノテーションをそれぞれ使用することで,WebリソースでサポートするMIMEメディアタイプを指定できます。ConsumesアノテーションとProducesアノテーションを使用していない場合は,すべてのメディアタイプがサポートされていると見されます。
ConsumesアノテーションとProducesアノテーションは,次に示す場所で使用できます。
-
ルートリソースクラス(クラスレベル)
-
サブリソースクラス(クラスレベル)
-
リソースメソッド(メソッドレベル)
-
サブリソースメソッド(メソッドレベル)
メソッドレベルで使用されているアノテーションは,クラスレベルで使用されているアノテーションより優先されます。
二つ以上のリソースメソッドまたはサブリソースメソッドが同じMIMEメディアタイプを処理できる場合で,要求メソッド識別子やパスなどほかの情報も一致するようなとき,エラーが発生します(KDJJ10006-E)。ルートリソースクラスでは,HTTPステータスコード500のHTTPレスポンスが返されます。サブリソースクラスでは,例外マッピングプロバイダで処理できるjava.lang.RuntimeExceptionがスローされます。
HTTPリクエストのContent-Typeヘッダが,どのConsumesアノテーションにも一致しない場合,エラーとなり(KDJJ10040-E),HTTPステータスコードに415が設定された,例外マッピングプロバイダで処理できるjavax.ws.rs.WebApplicationException がスローされます。
HTTPレスポンスのAccept HTTPヘッダが,どのProducesアノテーションにも一致しない場合,エラーとなり(KDJJ10041-E),HTTPステータスコードに406が設定された,例外マッピングプロバイダで処理できるjavax.ws.rs.WebApplicationException がスローされます。
メディアタイプ宣言の例を次に示します。
package com.sample.resources; java.awt.image.RenderedImage import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.Consumes; @Path("sample") @Produces("image/jpeg") public class ImageBasedResource { @GET public RenderedImage getAsImage() { //実装 } @GET @Produces("text/html") public String getAsHtml() { //実装 } @POST @Consumes("image/jpeg") public void addWidget(RenderedImage image) { //実装 } }
この例では,MIMEメディアタイプimage/jpegのHTTPレスポンスを要求するHTTP GETリクエストを処理するためにリソースメソッドgetAsImage()が呼び出されます。
また,MIMEメディアタイプtext/htmlのHTTPレスポンスを要求するHTTP GETリクエストを処理するためにリソースメソッドgetAsHtmlが呼び出されます。
さらに,MIMEメディアタイプimage/jpegのエンティティボディを持つHTTP POST要求を処理するためにリソースメソッドaddImageが呼び出されます。