[s2rest-dev:2] アノテーションの継承について

IZUNO Tadashi [E-MAIL ADDRESS DELETED]
2008年 4月 14日 (月) 12:08:35 JST


いづの@早速ですが。

現在S2RESTのexampleプロジェクトを作成しています。
その中で以下の不具合を見つけました。

リソースにインターフェースとその実装クラスがあった場合、
実装クラスのアノテーションのみが対象になっているようです。
実装クラスにアノテーションがなければ、インタフェースに設定していても動作しません。
カスタマイザで対象コンポーネントクラスののアノテーションを取得しているので、この時点
(ComponentDef#getComponentClass)で実装クラスがあるのものは実装クラスが帰ってきているためです。

最新版のJSR311(JAX-RS)の3.5に「スーパークラスおよびインタフェースのメソッドのアノテーションは継承される」
といった記載がありますし、jerseyでもそのように実装されています。

和田さんに問い合わせたところ未実装ということで回答をいただいたので、この部分を実装しようとしています。
そこでなんですがJAX-RSにはメソッドの継承については記載がありますが、クラスのアノテーションについては
継承の記載がありません。つまりjerceyでは以下のようなHogeの実装HogeImplがあった場合、@GET、@ProduceMimeは継承されますが、
@PATHは継承されません。

@PATH("/hoge")
interface Hoge {

    @GET
    @ProduceMime("text/plain")
    public String getHoge();

}

public class HogeImpl implements Hoge{
    public String getHoge(){
        ....
    }
}

僕は(インタフェースと実装が)1対1の場合にインタフェースを作るのはあまり好きではありませが、
設定と実装を分離するという観点ではインタフェースを作成するのは良いことのように思い始めています。
アノテーションはすべてinterfaceに設定し、実装はそこを意識せずに実装すれば良いんじゃないかとおもいます。

そこで以下の点についてご意見をうかがいたいのですが、

1.そもそもインタフェースやスーパクラスに設定されたアノテーションを継承すること自体がおかしなことなのかどうか
 (JAX-RSにも記載がありませんし、jerseyで利用しているasm-3.1でもそのように実装されているようなので)

2.インタフェースやスーパクラスに設定されたアノテーションを継承するのは利便性があるとおもうので、実装したいと
 思っていますがいかがでしょうか
 (実装クラス>スーパクラス>インタフェースの順序で優先度を決めればなんか良いような気がしますが・・・)

3.Seasarを使ってなにかうまくやる方法がないのか
(ComponentDef#getComponentClassで取得できたクラスからインタフェースクラスを取得しそのアノテーションを取得する実装も
してみましたがあまり美しくないような・・・)


以上


-- 
izuno <[E-MAIL ADDRESS DELETED]>


s2rest-dev メーリングリストの案内