Announcement Announcement Module
Collapse
No announcement yet.
AspectJ Pointcut Expression and ProxyFactoryBean(s) with Spring 2.0.1 Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • AspectJ Pointcut Expression and ProxyFactoryBean(s) with Spring 2.0.1

    Hello,

    I've tried to upgrade a Spring 2.0.0 project to Spring 2.0.1. One problem occured with some of my ProxyFactoryBeans which should be intercepted by one of my AspectJPointcutExpressions.
    My Aspect intercepts a method of a proxied interface on the target bean of the ProxyFactoryBean.

    I've created the following code for reproducing the problem.

    Base Interface:
    Code:
    public interface MyService {
    
    	public void someServiceMethod();
    
    	public void someOtherServiceMethod();
    
    	public String getMethodCalledMessage();
    
    	public void setMethodCalledMessage(String method);
    }
    Proxied Interface:
    Code:
    public interface MyServiceToIntroduce extends MyService {
    
    	public void introducedMethod();
    }
    Implementation (Target Bean):
    Code:
    public class MyServiceImpl implements MyService {
    
    	private static final Logger logger = Logger.getLogger(MyServiceImpl.class);
    
    	private String methodCalledMessage;
    
    	public void someOtherServiceMethod() {
    
    		logger.info("in someOtherServiceMethod");
    		this.setMethodCalledMessage("someOtherServiceMethod");
    	}
    
    	public void someServiceMethod() {
    
    		logger.info("in someServiceMethod");
    		this.setMethodCalledMessage("someServiceMethod");
    	}
    
    	public String getMethodCalledMessage() {
    		return this.methodCalledMessage;
    	}
    
    	public void setMethodCalledMessage(String method) {
    		this.methodCalledMessage = method;
    	}
    
    }
    Aspect:
    Code:
    @Aspect
    public class MyServiceAspect {
    
    	final Logger logger = Logger.getLogger(MyServiceAspect.class);
    
    	@Around(value = "execution(* some.package.MyService*.introduced*(..))"
    			+ " && target(service)", argNames = "joinPoint, service")
    	public void doIntroduce(ProceedingJoinPoint joinPoint, MyService service) {
    
    		logger.info("in aspect: doIntroduce");
    		service.setMethodCalledMessage(joinPoint.getSignature().getName());
    	}
    
    }
    applicationContext-proxyFactoryBean.xml:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:aop="http://www.springframework.org/schema/aop"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
    
    	<aop:aspectj-autoproxy />
    
    	<bean id="myServiceAspect"
    		class="some.package.MyServiceAspect" />
    
    	<bean id="myService"
    		class="org.springframework.aop.framework.ProxyFactoryBean">
    		<property name="proxyInterfaces">
    			<value>
    				some.package.MyServiceToIntroduce
    			</value>
    		</property>
    		<property name="target" ref="myServiceTarget" />
    	</bean>
    
    	<bean id="myServiceTarget"
    		class="some.package.MyServiceImpl" />
    </beans>
    Test:
    Code:
    public class AtAspectJPointcutExpressionWithProxyFactoryBeanInContextTest
    		extends AbstractSingleSpringContextTests {
    
    	public void testPointcutExpression() throws Exception {
    
    		MyServiceToIntroduce serviceToIntroduce = (MyServiceToIntroduce) applicationContext
    				.getBean("myService");
    
    		serviceToIntroduce.introducedMethod();
    
    		assertEquals("introducedMethod", serviceToIntroduce
    				.getMethodCalledMessage());
    	}
    
    	@Override
    	protected String[] getConfigLocations() {
    		return new String[] { "classpath:/applicationContext-proxyFactoryBean.xml" };
    	}
    
    }
    Stacktrace:
    Code:
    org.springframework.aop.AopInvocationException: AOP configuration seems to be invalid: tried calling method [public abstract void test.at.ccservices.spring.aop.service.MyServiceToIntroduce.introducedMethod()] on target [test.at.ccservices.spring.aop.service.MyServiceImpl@136a43c]; nested exception is java.lang.IllegalArgumentException: object is not an instance of declaring class
    Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
    	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.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:280)
    	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:199)
    	at $Proxy10.introducedMethod(Unknown Source)
    	at test.at.ccservices.spring.aop.annotations.AtAspectJPointcutExpressionWithProxyFactoryBeanInContextTest.testPointcutExpression(AtAspectJPointcutExpressionWithProxyFactoryBeanInContextTest.java:15)
    	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 junit.framework.TestCase.runTest(TestCase.java:164)
    	at junit.framework.TestCase.runBare(TestCase.java:130)
    	at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:69)
    	at junit.framework.TestResult$1.protect(TestResult.java:110)
    	at junit.framework.TestResult.runProtected(TestResult.java:128)
    	at junit.framework.TestResult.run(TestResult.java:113)
    	at junit.framework.TestCase.run(TestCase.java:120)
    	at junit.framework.TestSuite.runTest(TestSuite.java:228)
    	at junit.framework.TestSuite.run(TestSuite.java:223)
    	at org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:35)
    	at org.junit.internal.runners.CompositeRunner.run(CompositeRunner.java:29)
    	at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    	at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    	at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    	at org.junit.internal.runners.CompositeRunner.run(CompositeRunner.java:29)
    	at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    	at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    	at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
    With Spring 2.0.0 everything works fine! Thanks for your help in advance!

    Best Regards,
Working...
X