なんじゃくにっき

プログラミングの話題中心。

T2 Pluginでハマる・・

横断的関心事を処理したいがために書いた
T2用PluginでAfterActionのIntercepter(?)が上手く動かなかった。 

package test.plugin;

import org.t2framework.commons.meta.MethodDesc;
import org.t2framework.t2.action.ActionContext;
import org.t2framework.t2.plugin.AbstractPlugin;
import org.t2framework.t2.spi.Navigation;

public class TestPlugin extends AbstractPlugin{

@Override
public Navigation beforeActionInvoke(ActionContext actionContext,
MethodDesc targetMethod, Object page, Object[] args) {
System.out.println("BEFORE ACTION!");
return getPluginDefaultNavigation();
}

@Override
public Navigation afterActionInvoke(ActionContext actionContext,
MethodDesc targetMethod, Object page, Object[] args) {
System.out.println("AFTER ACTION!");
return getPluginDefaultNavigation();
}
}

『BEFORE ACTION!』は表示されるが『AFTER ACTION!』が出ない・・
公式wikiを読んでもそもそもpluginの実装の仕方は書いてなかったが、
メーリングリストを漁ったら解決。
0.6.1→0.6.2の間にafterActionInvokeの引数が増えたみたい。
 
    @Override
public Navigation afterActionInvoke(ActionContext actionContext,
MethodDesc targetMethod, Object page, Object[] args,
Navigation result) {
System.out.println("AFTER ACTION!");
if (result == null) {
return afterActionInvoke(actionContext, targetMethod, page, args);
} else {
return getPluginDefaultNavigation();
}
}
こうすると期待通りに動く。が、Pageを呼び出すたびに
beforeActionInvoke内の処理とslf4jのログの出力(INFO: リクエストを処理するPageクラスを
検出しました。ってやつ)の順番が前後して一定しない・・
資料があまりなくて(調整中だから?)よく理解できないのでやりたかったこと(認証)は
当面はコンテナのfilterで実装することにした。
 
因みにDIコンテナを使わずにPluginを差し込むにはWEB-XML


t2
org.t2framework.t2.filter.T2Filter

t2.rootpackage
test.page


t2.exclude-resources
css, js, png, gif, jpg


t2.components
test.plugin.TestPlugin


みたいに書けばいいみたい。複数登録の際は『,』区切り。
param-nameをt2.componentsとすればOK。
※クラスが見つからなくてもエラーにならないっぽいのでタイポに注意