Spring XML 5.1.0 java.lang.ClassCastException: com.sun.proxy. $ Proxy9 - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующий класс, который не реализует какой-либо интерфейс:

public class HelloWorld {
...
}

Ниже приведена моя конфигурация xml:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">

    <context:annotation-config/>
    <aop:aspectj-autoproxy />

    <bean id="helloBean" name="helloBean" class="com.mkyong.core.HelloWorld" autowire="byName">
        <property name="name" value="Mkyong"/>
    </bean>

    <bean id="log" class="com.mkyong.core.Log" />

    <bean id="cachedService" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target" ref="helloBean"/>
        <property name="proxyTargetClass" value="true"/>

    </bean>

Следующее работает и использует прокси CGLIB:

HelloWorld obj = (HelloWorld) context.getBean("cachedService");

Когда я добавляю следующую конфигурацию в XML, она не работает:

   <aop:config >
        <aop:aspect id = "log" ref = "log">
            <aop:pointcut id = "selectAll"
                          expression = "execution(* com.*.*.*.*(..))"/>
            <aop:before pointcut-ref = "selectAll" method = "beforeAdvice"/>
            <aop:after pointcut-ref = "selectAll" method = "afterAdvice"/>
        </aop:aspect>
    </aop:config>

Исключением является следующее, когда он пытается использовать прокси JDK: java.lang.ClassCastException:com.sun.proxy. $ Proxy9 не может быть преобразован в com.mkyong.core.HelloWorld

Я запутался как следующая работа и использую прокси CGLIB:

HelloWorld obj2 = (HelloWorld) context.getBean("helloBean");

по умолчаниюиспользовать прокси-сервер CGLIB, если нет интерфейса, поэтому почему он не работает?

helloBean работает, cachedService не работает


Обновление:

Это исправлениеПроблема:

 <aop:aspectj-autoproxy proxy-target-class="true"/>

proxy-target-class = "true" требуется для aop, даже если класс не реализует интерфейс, который должен использовать прокси CGLIB,

, но зачем это нужно?

1 Ответ

0 голосов
/ 25 октября 2018

Я думаю, вам нужно использовать:

<aop:aspectj-autoproxy proxy-target-class="true"/>

Так что AspectJ знает, как использовать CGLIB.Я не уверен, нужно ли вам помещать ваши bean-зависимости внутри элемента aop: aspect-autoproxy ... Раздел 11.6 документации Spring описывает это: https://docs.spring.io/spring/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html

...