17.1.11 アノテーションの継承

親クラスやインタフェースのメソッドで使用されているJAX-RS仕様のアノテーションは,子クラスや実装クラスに継承されます。

アノテーションが継承される条件を次に示します。

親クラスを継承し,かつインタフェースを実装している場合で,アノテーションを継承する条件に両方合致する場合は親クラスのアノテーションを優先します。

複数の親クラスを継承している場合,または複数のインタフェースを実装している場合,それぞれ最初に継承または実装している親クラスまたはインタフェースのアノテーションを優先します。

アノテーションが継承される例を次に示します。

package com.sample.resources;

import javax.ws.rs.GET;
import javax.ws.rs.QueryParam;

//インタフェース
public interface A {

 //JAX-RS仕様のアノテーションを使用しているメソッド
 @GET
 public String getValue(@QueryParam("query") String query);

}

package com.sample.resources;

import javax.ws.rs.Path;

//インタフェースを実装するルートリソースクラス
@Path("/root/")
public class Resource implements A {

 //メソッドの実装
 public String getValue(String query) {
   //実装

 }
}

package com.sample.resources;

import javax.ws.rs.Path;
import javax.ws.rs.Produces;

//インタフェースを実装するルートリソースクラス
@Path("/root1/")
public class Resource1 implements A {

 //メソッドの実装
 @Produces("text/xml")
 public String getValue(String query) {
   //実装
 }
}

この例では,インタフェースcom.sample.resources.A,ルートリソースクラスcom.sample.resources.Resource,およびルートリソースクラスcom.sample.resources.Resource1を含むWebアプリケーション(WARファイル)のコンテキストルートが"resource"で,"example.com"というホストで公開されているとします。

URL"http://example.com/resource/root?query=10"に対するHTTP GETリクエストは,リソースメソッドgetValue()にディスパッチされます。リソースメソッドgetValue()はインタフェースのGETアノテーションを継承しているためです。

一方で,URL"http://example.com/resource/root1?query=10"に対するHTTP GETリクエストは,リソースメソッドgetValue()にディスパッチされないで,HTTPステータスコード405が返ります。リソースメソッドgetValue()はインタフェースのGETアノテーションを継承していないためです。