読者です 読者をやめる 読者になる 読者になる

[Java]Stripes Frameworkどうよ。その5〜拡張ポイント

Stripesには、拡張ポイントが用意されていて、内部で実行されるクラスの実装をいくつか置き換えることができます。
HandlesEventアノテーションでは、イベント名称を指定するのが必須なのですが、メソッド名をイベント名とするように拡張してみます。
まず空のアノテーション Event を用意します。

2012-03-14追記:この拡張、意味がありませんでした。アノテーションなしのpublicメソッドで同じ動きになりました。。

package selva2;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Event {
}

次に、イベント名称を取得している、NameBasedActionResolverクラスを継承したクラスを作成し、メソッド名をイベント名称に使用するようにします。

package selva2;

import java.lang.reflect.Method;
import net.sourceforge.stripes.controller.NameBasedActionResolver;

public class XNameBasedActionResolver extends NameBasedActionResolver {

    @Override
    public String getHandledEvent(Method handler) {
        String event = super.getHandledEvent(handler);
        if (event != null) {
            return event;
        }
        else if (handler.getAnnotation(Event.class) != null) {
            return handler.getName();
        }
        return null;
    }
}

で、web.xmlでActionResolverの実装クラスを置き換える指定をします。

  <filter>
    <display-name>Stripes Filter</display-name>
    <filter-name>StripesFilter</filter-name>
    <filter-class>net.sourceforge.stripes.controller.StripesFilter</filter-class>
    <init-param>
      <param-name>ActionResolver.Class</param-name>
      <param-value>selva2.XNameBasedActionResolver</param-value>
    </init-param>
    :
    :
  </filter>

これで、標準では、

@HandlesEvent("submit")
public Resolution submit() {
	:
}

と書いていたのが、

@Event
public Resolution submit() {
	:
}

と省略できるようになるわけです。

以上