복붙노트

[SPRING] ClassCastException $ 프록시는 aop을 사용하여로 캐스트 될 수 없습니다.

SPRING

ClassCastException $ 프록시는 aop을 사용하여로 캐스트 될 수 없습니다.

콩을 통해 객체를 만드는 데 봄을 사용했습니다. 이제는 AOP를 사용하여 동일한 객체를 만들려고했지만 $ Proxy는 SaleRoom 예외로 캐스팅 할 수 없습니다.

이전 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/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>

그리고 다음 코드를 사용하여 판매를 생성했습니다.

    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;

이것은 새로운 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 로깅 클래스 :

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

나는 aop을 통해 빈을 만드는 데 같은 코드를 사용하고있다. 나는 스레드 "main"의 예외 java.lang.ClassCastException : $ Proxy11을 application.common.entities.SaleRoom으로 캐스팅 할 수 없습니다.

예외를 throw하는 행 : saleRoom = (SaleRoom) context.getBean (saleName);

어떤 도움을 주시면 감사하겠습니다. 감사.

해결법

  1. ==============================

    1.SaleRoom 클래스가 인터페이스를 구현합니까? 그렇다면 클래스를 사용하지 말고 인터페이스를 사용해야합니다.

    SaleRoom 클래스가 인터페이스를 구현합니까? 그렇다면 클래스를 사용하지 말고 인터페이스를 사용해야합니다.

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

    bean이 어떤 인터페이스를 구현한다면, 기본적으로 Spring은이 인터페이스를 기반으로하는 프록시를 생성 할 것이기 때문이다.

    다음은 Spring에서 프록시 생성에 대한 좋은 기사입니다.

    또한 목표 클래스에 대한 프록시를 생성하고자한다면 Spring AOP의 프록시 메커니즘을 변경할 수있다. 이 내용은 참조 설명서에 설명되어 있습니다.

  2. from https://stackoverflow.com/questions/13461985/classcastexception-proxy-cannot-be-cast-to-using-aop by cc-by-sa and MIT license