ClassCastException $ Proxy cannot be applied to using aop

I used spring to create objects through beans. Now I tried using aop to create the same object, and I get $ Proxy cannot be applied to SalesRoom exception.

previous xml was:

<?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/spring-aop-2.5.xsd" xmlns:context="http://www.springframework.org/schema/context/spring-context-2.5.xsd" xmlns:flow="http://www.springframework.org/schema/webflow-config/spring-webflow-config- 1.0.xsd" xmlns:jm s="http://www.springframework.org/schema/jms/spring-jms-2.5.xsd" xmlns:jee="http://www.springframework.org/schema/jee/spring-jee-2.5.xsd" xmlns:lang="http://www.springframework.org/schema/lang/spring-lang-2.5.xsd" xmlns:osgi="http://www.springframework.org/schema/osgi/spring-osgi.xsd" xmlns:tx="http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" xmlns:util="http://www.springframework.org/schema/util/spring-util-2.5.xsd" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/aop/spring-aop-2.5.xsd/spring-spring-aop-2.5.xsd-2.5.xsd http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/context/spring-context-2.5.xsd/spring-spring-context-2.5.xsd-2.5.xsd http://www.springframework.org/schema/webflow-config/spring-webflow-config-1.0.xsd http://www.springframework.org/schema/webflow-config/spring-webflow-config-1.0.xsd/spring-spring-webflow-config-1.0.xsd-2.5.xsd http://www.springframework.org/schema/jms/spring-jms-2.5.xsd http://www.springframework.org/schema/jms/spring-jms-2.5.xsd/spring-spring-jms-2.5.xsd-2.5.xsd http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/jee/spring-jee-2.5.xsd/spring-spring-jee-2.5.xsd-2.5.xsd http://www.springframework.org/schema/lang/spring-lang-2.5.xsd http://www.springframework.org/schema/lang/spring-lang-2.5.xsd/spring-spring-lang-2.5.xsd-2.5.xsd http://www.springframework.org/schema/osgi/spring-osgi.xsd http://www.springframework.org/schema/osgi/spring-osgi.xsd/spring-spring-osgi.xsd-2.5.xsd http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/tx/spring-tx-2.5.xsd/spring-spring-tx-2.5.xsd-2.5.xsd http://www.springframework.org/schema/util/spring-util-2.5.xsd http://www.springframework.org/schema/util/spring-util-2.5.xsd/spring-spring-util-2.5.xsd-2.5.xsd "> <bean id="sale01" class="application.common.entities.BidRoom"> <property name="itemId" value="0001"/> <property name="lifeTime" value="15"/> </bean> </beans> 

And I used the following code to create sales:

  ApplicationContext context = new FileSystemXmlApplicationContext(SalesManager.getSalesSourceFile()); SaleRoom saleRoom; List<String> salesNames = new LinkedList<String>(); List<SaleRoom> allSales = new LinkedList<SaleRoom>(); // Get all sales id for beans NodeList salesNodeList = salesDoc.getElementsByTagName("bean"); for (int i = 0; i < salesNodeList.getLength(); i++) { Node nNode = salesNodeList.item(i); salesNames.add(((Element) nNode).getAttribute("id").toString()); } for (String saleName : salesNames) { if(saleName.contains("sale")) { saleRoom = (SaleRoom) context.getBean(saleName); allSales.add(saleRoom); } } return allSales; 

This is the new xml:

 <?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> <aop:include name="logSettersCalls"/> </aop:aspectj-autoproxy> <bean id="logSettersCalls" class="application.logging.aop.LogSettersCalls"/> <bean id="sale01" class="application.common.entities.BidRoom"> <constructor-arg index="0" type="int" value="0001"/> <constructor-arg index="1" type="int" value="15"/> </bean> </beans> 

Aspect Logging Class:

 @Aspect public class LogSettersCalls { @Pointcut("execution(void set*(*))") public void setMethod() {} @Before("setMethod()") public void logSetterCall(JoinPoint theJoinPoint) { String methodName = theJoinPoint.getSignature().getName(); Object newValue = theJoinPoint.getArgs()[0]; Object theObject = theJoinPoint.getTarget(); System.out.println("The method " + methodName + " is called on object " + theObject + " with the value " + newValue); } } 

I use the same code to create beans through aop. and I get an exception in the stream "main" java.lang.ClassCastException: $ Proxy11 cannot be attributed to application.common.entities.SaleRoom

The line that throws the exception: saleRoom = (SaleRoom) context.getBean (saleName);

Any help would be appreciated. Thank you

+6
source share
1 answer

Does your SalesRoom class use some interface? If so, then you should use an interface in your code, not a class:

 ISaleRoom saleRoom = (ISaleRoom) context.getBean(saleName); 

Because if your bean implements some interface, then Spring will create a proxy server based on this interface by default.

Here is a good article on creating proxies in Spring.

You can also change the proxy mechanism for Spring AOP if you want to create proxies for the target class. This is described here in the reference documentation .

+36
source

All Articles