[Seasar-user:3293] Genericなメソッドへのアスペクトの適用

Kaisei HAMAMOTO hamamoto
2006年 2月 28日 (火) 17:03:38 JST


浜本です。お世話になっております。

S2AOPで、Genericな戻り値を持つメソッドにアスペクトを適用するとエラーが発生します。
使用しているのは Seasar 2.3.4 と Javassist 3.1 です。

この現象への対処方法はありますでしょうか。
よろしくお願いいたします。

[再現例]
以下のようにファイルを用意し、test.Testを実行すると例外が発生します。

---- test/DummyStringList.java ----

package test;

import java.util.AbstractList;

public class DummyStringList extends AbstractList<String> {
    public String get(int index) { return null; }
    public int size() { return 0; }
}

---- test/test.dicon ----

<component class="test.DummyStringList">
  <aspect pointcut="get">
    <component class="org.seasar.framework.aop.interceptors.TraceInterceptor"/>
  </aspect>
</component>

---- test/Test.java ----

public static void main(String[] args) {
    S2Container c = S2ContainerFactory.create("test/test.dicon");
    c.init();
}

Exception in thread "main" org.seasar.framework.aop.javassist.CannotCompileRuntimeException:
[ESSR0017]例外が発生しました。理由はjavassist.CannotCompileException: duplicate method: get$$invokeSuperMethod$$
at org.seasar.framework.aop.javassist.AbstractGenerator.createMethod(AbstractGenerator.java:262)
  at org.seasar.framework.aop.javassist.EnhancedClassGenerator.createInvokeSuperMethod(EnhancedClassGenerator.java:54)
  at org.seasar.framework.aop.javassist.AspectWeaver.createInvokeSuperMethod(AspectWeaver.java:125)
  at org.seasar.framework.aop.javassist.AspectWeaver.setInterceptors(AspectWeaver.java:72)
  at org.seasar.framework.aop.proxy.AopProxy.setAspects(AopProxy.java:95)
  at org.seasar.framework.aop.proxy.AopProxy.<init>(AopProxy.java:61)
  at org.seasar.framework.container.util.AopProxyUtil.getConcreteClass(AopProxyUtil.java:41)
  at org.seasar.framework.container.impl.ComponentDefImpl.getConcreteClass(ComponentDefImpl.java:139)
  at org.seasar.framework.container.assembler.AutoConstructorAssembler.getSuitableConstructor(AutoConstructorAssembler.java:50)
  at org.seasar.framework.container.assembler.AutoConstructorAssembler.doAssemble(AutoConstructorAssembler.java:39)
  at org.seasar.framework.container.assembler.AbstractConstructorAssembler.assemble(AbstractConstructorAssembler.java:50)
  at org.seasar.framework.container.deployer.SingletonComponentDeployer.assemble(SingletonComponentDeployer.java:67)
  at org.seasar.framework.container.deployer.SingletonComponentDeployer.deploy(SingletonComponentDeployer.java:51)
  at org.seasar.framework.container.deployer.SingletonComponentDeployer.init(SingletonComponentDeployer.java:96)
  at org.seasar.framework.container.impl.ComponentDefImpl.init(ComponentDefImpl.java:272)
  at org.seasar.framework.container.impl.S2ContainerImpl.init(S2ContainerImpl.java:361)
  at test.Test.main(Test.java:9)
Caused by: javassist.CannotCompileException: duplicate method: get$$invokeSuperMethod$$
  at javassist.bytecode.ClassFile.testExistingMethod(ClassFile.java:544)
  at javassist.bytecode.ClassFile.addMethod(ClassFile.java:528)
  at javassist.CtClassType.addMethod(CtClassType.java:1062)
  at org.seasar.framework.aop.javassist.AbstractGenerator.createMethod(AbstractGenerator.java:257)
  ... 16 more



Seasar-user メーリングリストの案内