3 Replies Latest reply on May 12, 2007 5:35 PM by waynebaylor

    Intercepting EJB3 EntityBeans

    waynebaylor

      I am trying to intercept EJB3 EntityBean methods, but I'm getting a javassist.CannotCompileException.

      The jboss-aop.xml file I'm using is:

      <aop>
       <typedef
       name="logclasses"
       expr="class(test.*) AND
       !class(test.aop.*)"/>
       <bind pointcut="execution(* $typedef{logclasses}->*(..))">
       <interceptor
       class="aop.LoggingInterceptor"/>
       </bind>
      </aop>


      And the exception I get is:
      2007-05-11 18:34:02,032 ERROR [STDERR] [warn] AOP Instrumentor failed to transform
      test.entity.GroupEntity_$$_javassist_263
      2007-05-11 18:34:02,032 ERROR [STDERR] javassist.CannotCompileException: duplicate method: _getAdvisor
      2007-05-11 18:34:02,048 ERROR [STDERR] at javassist.bytecode.ClassFile.testExistingMethod(ClassFile.java:548)
      2007-05-11 18:34:02,048 ERROR [STDERR] at javassist.bytecode.ClassFile.addMethod(ClassFile.java:528)
      2007-05-11 18:34:02,048 ERROR [STDERR] at javassist.CtClassType.addMethod(CtClassType.java:1170)
      2007-05-11 18:34:02,048 ERROR [STDERR] at org.jboss.aop.instrument.ClassicInstrumentor.addHelperClass(ClassicInstrumentor.java:194)
      2007-05-11 18:34:02,048 ERROR [STDERR] at org.jboss.aop.instrument.ClassicInstrumentor.doSetupBasics(ClassicInstrumentor.java:164)
      2007-05-11 18:34:02,048 ERROR [STDERR] at org.jboss.aop.instrument.Instrumentor.setupBasics(Instrumentor.java:842)
      2007-05-11 18:34:02,048 ERROR [STDERR] at org.jboss.aop.instrument.MethodExecutionTransformer.instrument(MethodExecutionTransformer.java:143)
      2007-05-11 18:34:02,048 ERROR [STDERR] at org.jboss.aop.instrument.Instrumentor.transform(Instrumentor.java:658)
      2007-05-11 18:34:02,048 ERROR [STDERR] at org.jboss.aop.AspectManager.translate(AspectManager.java:908)
      2007-05-11 18:34:02,048 ERROR [STDERR] at org.jboss.aop.AspectManager.transform(AspectManager.java:820)
      2007-05-11 18:34:02,048 ERROR [STDERR] at org.jboss.aop.standalone.AOPTransformer.aspectTransform(AOPTransformer.java:88)
      2007-05-11 18:34:02,063 ERROR [STDERR] at org.jboss.aop.standalone.AOPTransformer.transform(AOPTransformer.java:75)
      2007-05-11 18:34:02,063 ERROR [STDERR] at sun.instrument.TransformerManager.transform(TransformerManager.java:122)
      2007-05-11 18:34:02,063 ERROR [STDERR] at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:155)
      2007-05-11 18:34:02,063 ERROR [STDERR] at java.lang.ClassLoader.defineClass1(Native Method)
      2007-05-11 18:34:02,063 ERROR [STDERR] at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
      2007-05-11 18:34:02,063 ERROR [STDERR] at sun.reflect.GeneratedMethodAccessor125.invoke(Unknown Source)
      2007-05-11 18:34:02,063 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      2007-05-11 18:34:02,063 ERROR [STDERR] at java.lang.reflect.Method.invoke(Method.java:585)
      2007-05-11 18:34:02,063 ERROR [STDERR] at javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:159)
      2007-05-11 18:34:02,063 ERROR [STDERR] at javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:170)
      etc...

      The weird thing is that the pointcut is properly bound to non-EntityBeans in the same package. How can I get the pointcut to bind to EntityBeans too?


        • 1. Re: Intercepting EJB3 EntityBeans
          kabirkhan

          It almost looks like it is weaving it twice. What version of aop + app server are you using?

          • 2. Re: Intercepting EJB3 EntityBeans
            waynebaylor

            Thanks for the reply.

            I'm using
            - JBoss 4.0.5GA ejb3 installation
            - JBoss AOP 1.5.5GA

            It almost looks like it is weaving it twice.


            Yes, I was thinking the class being labled @Entity might be causing it to be weaved separately and then re-weaved with my pointcut (only a guess though).

            • 3. Re: Intercepting EJB3 EntityBeans
              waynebaylor

              Upon further testing it appears that specfying the EntityBean results in the class being properly woven.

              I used

              <typedef name="logclasses" expr="class(test.entity.GroupEntity)"/>


              and the pointcut was properly bound. When classes are specified with wildcards(*) are they woven differently?