[SPRING] ClassCastException $ 프록시는 aop을 사용하여로 캐스트 될 수 없습니다.
SPRINGClassCastException $ 프록시는 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.SaleRoom 클래스가 인터페이스를 구현합니까? 그렇다면 클래스를 사용하지 말고 인터페이스를 사용해야합니다.
SaleRoom 클래스가 인터페이스를 구현합니까? 그렇다면 클래스를 사용하지 말고 인터페이스를 사용해야합니다.
ISaleRoom saleRoom = (ISaleRoom) context.getBean(saleName);
bean이 어떤 인터페이스를 구현한다면, 기본적으로 Spring은이 인터페이스를 기반으로하는 프록시를 생성 할 것이기 때문이다.
다음은 Spring에서 프록시 생성에 대한 좋은 기사입니다.
또한 목표 클래스에 대한 프록시를 생성하고자한다면 Spring AOP의 프록시 메커니즘을 변경할 수있다. 이 내용은 참조 설명서에 설명되어 있습니다.
from https://stackoverflow.com/questions/13461985/classcastexception-proxy-cannot-be-cast-to-using-aop by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 하나의 객체에서 DTO와 Entity? (0) | 2019.02.11 |
---|---|
[SPRING] Spring @ Transactional Annotation : 자체 호출 (0) | 2019.02.11 |
[SPRING] 테스트 용 스프링 부트 설정 보안 (0) | 2019.02.11 |
[SPRING] Spring MVC에서 RequestParam과 함께 Valid 매개 변수를 사용할 수없는 이유는 무엇입니까? (0) | 2019.02.11 |
[SPRING] faces-config.xml의 EL 해결 프로그램 (0) | 2019.02.11 |