tapestry-s2-integration

Web系から離れてしまって最近の情報に疎くなってしまった。
というわけで色々調査がてらTapestry5とS2を統合してみました。どうすればいいのかなとか考えてたらいつの間にかT5のリポジトリtapestry-spring-integrationとかできてるし。だから単純にパクっただけ。すごい簡単にできた。

ModuleクラスのSubModuleに指定して使います。

@Id("app")
@SubModule(S2Module.class)
public class AppModule {
}

ページ側はこんな感じです。Greetingという型でバインディングしてます。

public class Start {
    @Inject("s2:")
    private Greeting greeting;
    
    public String getGreeting() {
        return greeting.greet();
    }
}

コンポーネント名でバインディングしたいときは、@Inject("s2:コンポーネント")とします。

ハッキリ言ってちゃんと動くかわかりませんwT5を全然理解してないし何かしらのアプリすら作ったことないですからね。ホットデプロイとかは当然未確認ですよ。つまりその程度です。

アノテーション対応

定数アノテーションの、しかもBINDINGアノテーションだけですが対応してみました。自動バインディング対象のコンポーネントがない場合のエラーや警告は次のようにしています。

  • bindingType=must
    • エラー
  • bindingType=should
    • 警告
  • bindingType=may
    • 何も出さない
  • bindingType=none
  • プロパティ名が指定されているとき
    • エラー
  • 不正なbindingType
    • エラー

AutoRegisterで出ていたnullがセットされますという警告が、これで表示されなくなるはずです。


実装方法は悩んだのですが、IRttiPropertyDescriptor#getAdaptorを使ってアノテーションを取得できるようにしました。たとえば

IRtti rtti = (IRtti) component.getAdaptor(IRtti.class);
IRttiPropertyDescriptor propDesc = rtti.getProperty("hoge");
IBindingAnnotation ba = (IBindingAnnotation) propDesc.getAdaptor(IBindingAnnotation.class);

という感じです。見たところRTTIとdiconモデルは分離されているようなので、diconモデルからRTTIを取得しようとしたときだけアノテーションをサポートしたRTTIでラップするという形にしました。