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

Takuto Wada [E-MAIL ADDRESS DELETED]
2008年 4月 15日 (火) 06:07:55 JST


いづのさん
MLへの投稿ありがとうございます。和田です。

2008/4/14 IZUNO Tadashi <[E-MAIL ADDRESS DELETED]>:
> いづの@早速ですが。
>
>  現在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.インタフェースやスーパクラスに設定されたアノテーションを継承するのは利便性があるとおもうので、実装したいと
>  思っていますがいかがでしょうか
>  (実装クラス>スーパクラス>インタフェースの順序で優先度を決めればなんか良いような気がしますが・・・)
>
1,2に関して、
まず実装クラスにアノテーションが無く、インタフェースにある場合。
これは上記の議論にあったように、実装クラスについたアノテーションと
同様に動作するほうが良いと思います。

端的に言えば、私の考慮漏れです。
いづのさん、ご指摘 & 実装立候補ありがとうございます!


で、問題は
「継承階層の中でPathなどが複数回出現する場合にどのように振る舞うべきか」
ということですね。

これは私自身まだよく分かっていない点であり、
いろいろな方のご意見を聞きたいところでもあります。

アノテーションの継承は実際使う際には結構便利そうに思えるのですが、
私自身はアノテーションの継承にあまり出会ったことがないので、
いまのところ強い意見が無いのです。

「便利であること、かつ矛盾がないこと」、が大事だと考えています。
複数の解釈を許してしまうと、だんだん使う人も解らなくなってきてしまいますよね。


確かjerseyはreference implementationの立ち位置だったでしょうか。
だとするなら、仕様の詳細はjerseyの動作を一応の正とするのでしょうか。

jerseyにくわしいひと、求む。


余談ですが、実際触ってみると、JAX-RSのアノテーションには
抽象的なもの(@Pathなど)と具象に近いものが混在している印象を受けます。
抽象的なものはインタフェースにもふさわしく、
具象的なものは結構密接に結びついてしまいがちです
(メソッドの戻りの型がStringで中がJSONそのもの、などなど)。
このあたりの仕様上の議論 on JSR311もキャッチアップしたいところですね。


>  3.Seasarを使ってなにかうまくやる方法がないのか
>  (ComponentDef#getComponentClassで取得できたクラスからインタフェースクラスを取得しそのアノテーションを取得する実装も
>  してみましたがあまり美しくないような・・・)
>
こちらは、まずは他のプロジェクトの実装を
参考にさせていただくというところではないでしょうか。


申し訳ありませんが、ちょっと時間がなくなってきてしまいました。
S2RESTの開始当初の意図や、今後の拡張案などは、後日メールいたしますね。

まずは以上です。
いづのさん、みなさま、これからもよろしくお願いします!


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