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

山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

diconファイルのワーニングマーカが微妙

java seasar2 kijimuna

seasar2のS2Containerと戯れていたら、diconファイルにkijimunaのワーニングが出てしまい、ググッても原因がわかりません。しかもパッケージエクスプローラ上にはワーニングマーカが出ないのに、app.diconを開くとエディタ上にマーカが表示されます。

やりたいことは簡単で、インターフェースを継承しないクラスのメソッドにAOPを適用したいだけです。今回はS2Containerに標準でついているTraceIntercepterで試してみました。

ソースもすごくシンプルです。

まず、AOPを適用したいクラスです。

package org.yyama.reoprt1;

public class Class1 {
    public void print() {
        System.out.println("heloo!!");
    }
}


メインクラスです。

package org.yyama.reoprt1;

import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class Main {
    public static void main(String[] args) throws Exception {
        SingletonS2ContainerFactory.init();
        Class1 cls1 = SingletonS2Container.getComponent(Class1.class);
        cls1.print();
    }
}


問題のdiconファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
	"http://www.seasar.org/dtd/components24.dtd">
<components>
    <include path="aop.dicon" />
    <component class="org.yyama.reoprt1.Class1">
        <!-- ↓↓↓ この行にワーニングが出力される。 ↓↓↓ -->
        <aspect>aop.traceInterceptor</aspect>
        <!-- ↑↑↑ この行にワーニングが出力される。 ↑↑↑ -->
    </component>
</components>

ワーニングの内容は、「org.yyama.reoprt1.Class1はインターフェイスを実装していないので、aspectが適用されるメソッドがありません。」。

インターフェースを実装していなくてもObjectクラスに属していないpublicかつ非ファイナルなメソッドにはaspectは適用されるはず。っていうか、このサンプルではトレース情報が正しく出力される。

実行結果

2013-02-16 17:19:52,437 [main] DEBUG org.seasar.framework.aop.interceptors.TraceInterceptor - BEGIN org.yyama.reoprt1.Class1#print()
heloo!!
2013-02-16 17:19:52,437 [main] DEBUG org.seasar.framework.aop.interceptors.TraceInterceptor - END org.yyama.reoprt1.Class1#print() : null


eclipseのヴァージョンは3.7。
S2Containerのヴァージョンは2.4.45です。

まぁ、気持ち悪いというだけですが、、、

とりあえず、継続調査とし、先に進みます。