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が呼び出されます。