Announcement Announcement Module
Collapse
No announcement yet.
custom aspect working in 2.0.1 but not in 2.0.2 Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • custom aspect working in 2.0.1 but not in 2.0.2

    I am using annotated interceptors and have code working perfectly in spring 2.0.1. I upgraded to spring 2.0.2 and one of my interceptors now fails to load in Tomcat 5.5.17 and Java 1.5.2_07

    This is the stack trace...

    Code:
    2007-01-17 12:25:52,653 : ERROR : main : context.ContextLoader : Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error Type referred to is not an annotation type: transaction
    Caused by: 
    java.lang.IllegalArgumentException: error Type referred to is not an annotation type: transaction
    	at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:315)
    	at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:159)
    	at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:149)
    	at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:134)
    	at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:166)
    	at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:226)
    	at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:256)
    	at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:85)
    	at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69)
    	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:265)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:316)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1094)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:429)
    	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:250)
    	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141)
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:247)
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:161)
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:341)
    	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:250)
    	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141)
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:247)
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:161)
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:273)
    	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:346)
    	at org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.refresh(AbstractRefreshableWebApplicationContext.java:156)
    	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:246)
    	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:184)
    	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
    	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3729)
    	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4187)
    	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759)
    	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
    	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
    	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:809)
    	at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:698)
    	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:472)
    	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1122)
    	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:310)
    	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1021)
    	at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
    	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1013)
    	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442)
    	at org.apache.catalina.core.StandardService.start(StandardService.java:450)
    	at org.apache.catalina.core.StandardServer.start(StandardServer.java:709)
    	at org.apache.catalina.startup.Catalina.start(Catalina.java:551)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:585)
    	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
    	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)
    This is the bean definition...

    Code:
    	<!-- activate the annotated interceptors -->
    	<aop:aspectj-autoproxy />
    
    	<bean id="transactionInterceptor"
    		class="net.company.aop.TransactionInterceptor">
    		<property name="transactionManager" ref="transactionManager" />
    		<property name="order" value="3" />
    	</bean>
    This is the transaction interceptor, which causes the stack trace above on starting up tomcat. The 'transaction' mentioned in the stack trace is the transaction parameter on the around advice method...

    Code:
    package net.company.aop;
    
    import net.company.annotations.Transaction;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.core.Ordered;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.TransactionStatus;
    import org.springframework.transaction.support.DefaultTransactionDefinition;
    
    @Aspect
    public class TransactionInterceptor implements Ordered {
    
        private final Log log = LogFactory.getLog(getClass());
    
        private PlatformTransactionManager transactionManager;
    
        private int order;
    
        // -------------------------------------------------------
        // allows us to control the ordering of advice
        public int getOrder() {
    	return this.order;
        }
    
        public void setOrder(int order) {
    	this.order = order;
        }
    
        public void setTransactionManager(PlatformTransactionManager transactionManager) {
            this.transactionManager = transactionManager;
        }
    
        // -------------------------------------------------------
        @Around(value = "execution(* net.company.workflow..*.*(..)) && @annotation(transaction)")
        public Object around(ProceedingJoinPoint pjp, Transaction transaction) throws Throwable {
    
    	Object result;
    	TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    	log.info("BEGIN TRANSACTION");
    
    	try {
    	    result = pjp.proceed();
    	} catch (Exception e) {
    	    log.info("ROLLBACK TRANSACTION");
    	    transactionManager.rollback(status);
    	    throw e;
    	}
    	
    	log.info("COMMIT TRANSACTION");
    	transactionManager.commit(status);
    	return result;
    
        }
    
    
    }
    Here is the annotation class...

    Code:
    package net.company.annotations;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Transaction {
    }
    I do not know why the stack trace complains about the dataSource bean, but here is the definition...

    Code:
    	<bean id="dataSource"
    		class="org.apache.commons.dbcp.BasicDataSource"
    		destroy-method="close">
    		<property name="driverClassName"
    			value="${jdbc.driverClassName}" />
    		<property name="url" value="${jdbc.url}" />
    	</bean>
    
    	<bean id="transactionManager"
    		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    		<property name="dataSource" ref="dataSource" />
    	</bean>
    Please note that it all works fine in 2.0.1 and only causes the error when the transaction interceptor is present in 2.0.2. I have other interceptors including another around advice based on a different annotation which all work fine in 2.0.2. Only my interceptor above fails in 2.0.2. I have tried changing the name of my transaction annotation and parameter with no luck.

    What is happening here? Is this a bug..?

  • #2
    This does look like a bug; parser seems to be looking for a type rather than an identifier. Please file a JIRA issue.

    -Ramnivas

    Comment


    • #3
      http://opensource.atlassian.com/proj...rowse/SPR-3064

      Comment


      • #4
        Reproduction of the error

        Hi,
        Sorry for cross posting, since I added this file to the jira, but I really need to fix this asap, and need all the help I can get.

        I get the same error in my project and I packaged a small reproduction of it.

        I have a test case ''SeguridadServiceTest'' that runs a couple of methods to be intercepted by the following advice:

        Code:
        @Before("protegido() && @annotation(protegido)")
        	public void checaAntes(Protegido protegido) {
        		/**
        		 * HERE IS the BUG,
        		 * comment either the if or its body,
        		 * and the test will run OK.
        		 */
        		if (getConfiguracionLocal().getSeguridadActivada()) {
        			RolSoni rol = new RolSoni();
        		}
        		LOGGER.info("[--------Aspect EXECUTED--------]");
        	}

        The tricky part its in the IF_BLOCK, either I comment the if or its body the test ends correctly.

        Thanks a lot,

        Miguel

        Comment


        • #5
          Your pointcut looks wrong. Your referred pointcut and annotation identifier are both protegido. That will sure confuse the parser.
          Code:
          protegido() && @annotation(protegido)
          Can you try changing the annotation identifier name (or the pointcut name)? Please report back.

          -Ramnivas

          Comment


          • #6
            Changed the pointcut name but the error is still there.

            Hi Ramnivas,

            Thanks for your reply.
            I changed the pointcut and the annotation binding name:

            Code:
            @Pointcut("execution(@mx.com.sonigas.commons.annotations.Protegido * mx.com.sonigas..*.*(..))")
            	public void annotatedMethod() {
            
            	}
            
            	@Before("annotatedMethod() && @annotation(a_1)")
            	public void checaAntes(Protegido a_1) {
            		/**
            		 * HERE IS the BUG,
            		 * comment either the if or its body,
            		 * and the test will run OK.
            		 */
            		if (getConfiguracionLocal().getSeguridadActivada()) {
            			RolSoni rol = new RolSoni();
            		}
            		LOGGER.info("[--------Aspect EXECUTED--------]");
            	}
            And I keep getting the same error:

            Code:
            -------------------------------------------------------------------------------
            Test set: mx.com.sonigas.commons.service.SeguridadServiceTest
            -------------------------------------------------------------------------------
            Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.352 sec <<< FAILURE!
            testCrear(mx.com.sonigas.commons.service.SeguridadServiceTest)  Time elapsed: 1.19 sec  <<< ERROR!
            org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'seguridadService' defined in class path resource [commonsCoreApplicationContext.xml]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error Type referred to is not an annotation type: a_1
            Caused by: java.lang.IllegalArgumentException: error Type referred to is not an annotation type: a_1
            	at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:315)
            	at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:159)
            	at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:149)
            	at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:134)
            	at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:166)
            	at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:226)
            	at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:256)
            	at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:85)
            	at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69)
            	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:265)
            	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:316)
            	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1094)
            	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:429)
            	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:250)
            	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141)
            	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:247)
            	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:161)
            	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:273)
            	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:346)
            	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:92)
            	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:77)
            	at mx.com.sonigas.commons.service.SeguridadServiceTest.setUp(SeguridadServiceTest.java:23)
            	at junit.framework.TestCase.runBare(TestCase.java:128)
            	at junit.framework.TestResult$1.protect(TestResult.java:106)
            	at junit.framework.TestResult.runProtected(TestResult.java:124)
            	at junit.framework.TestResult.run(TestResult.java:109)
            	at junit.framework.TestCase.run(TestCase.java:120)
            	at junit.framework.TestSuite.runTest(TestSuite.java:230)
            	at junit.framework.TestSuite.run(TestSuite.java:225)
            	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            	at namesun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            	at java.lang.reflect.Method.invoke(Method.java:585)
            	at org.apache.maven.surefire.junit.JUnitTestSet.execute(JUnitTestSet.java:213)
            	at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:138)
            	at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:125)
            	at org.apache.maven.surefire.Surefire.run(Surefire.java:132)
            	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            	at java.lang.reflect.Method.invoke(Method.java:585)
            	at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:290)
            	at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:818)
            	at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:818)
            So this doesn't seem to be a conflict with the names.

            regards,

            Miguel

            Comment

            Working...
            X