2012-11-19 4 views
6

Ich habe Spring verwendet, um Objekte über Beans zu erstellen. Jetzt habe ich versucht, AOP zu verwenden, um das gleiche Objekt zu erstellen, und ich bekomme $ Proxy kann nicht in SaleRoom Ausnahme umgewandelt werden.

die vorherige xml war:

<?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> 

Und ich habe den folgenden Code, um die Verkäufe zu erstellen:

ApplicationContext context = new FileSystemXmlApplicationContext(SalesManager.getSalesSourceFile()); 
    SaleRoom saleRoom; 
    List<String> salesNames = new LinkedList<String>(); 
    List<SaleRoom> allSales = new LinkedList<SaleRoom>(); 

    // Get all sales id's 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; 

Dies ist die neue 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> 

Die Aspect-Protokollierung Klasse:

@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); 
    } 
} 

Ich benutze den gleichen Code zum Erstellen der Bohnen über AOP. und ich bekomme Exception in thread "main" java.lang.ClassCastException: $ Proxy11 kann nicht auf application.common.entities.SaleRoom gegossen werden

Die Linie, die die Ausnahme auslöst: Auktionsraum = (Auktionsraum) context.getBean (VerkaufName);

Jede Hilfe wird geschätzt. Vielen Dank.

Antwort

36

Implementiert Ihre SaleRoom-Klasse eine Schnittstelle? Wenn ja, dann sollten Sie Schnittstelle verwenden und nicht die Klasse in Sie Code:

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

Denn wenn Ihr Bean implementiert eine Schnittstelle dann Frühling wird standardmäßig Proxy erstellen auf dieser Schnittstelle basiert.

Hier ist a good article about proxy creation in Spring.

Sie können auch für den Frühling AOP Proxying-Mechanismus ändern, wenn Sie Proxy für Zielklasse erstellen möchten. Dies wird beschrieben here in reference documentation.

+0

Mein SaleRoom erweitert Thread und implementiert keine Schnittstelle. – Tsikon

+2

Ich denke, dass der Grund für das Problem ist, dass Thread Runnable implementiert. Versuchen Sie, eine eigene Geschäftsschnittstelle (z. B. ISaleRoom) zu erstellen, in der Geschäftsmethoden definiert werden, auf die Sie zugreifen müssen. Dann in Code umgewandelt, um Schnittstelle (ISaleRoom) context.getBean (saleName) wie ich in Antwort erwähnt. – dimas

+0

Oder Sie können versuchen, Proxy-Mechanismus zu ändern (siehe den Link, den ich gepostet habe). – dimas

Verwandte Themen