Spring XML 5.1.0 java.lang.ClassCastException: com.sun.proxy. $ Proxy9

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

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,

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
98
1

Ответы 1

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

<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

Я знаю, что это решение, по которому я обновил вопрос, но каково объяснение?

Mohammad Karmi 25.10.2018 18:34

Я предполагаю, что AspectJ по умолчанию не использует CGLIB ... :-(

moilejter 25.10.2018 18:40

Тогда почему getBean работал с helloBean? Я не могу найти объяснения

Mohammad Karmi 25.10.2018 18:42

Другие вопросы по теме