ClassCastException: com.sun.proxy. $ ProxyX не может быть приведен к классу - PullRequest
0 голосов
/ 22 октября 2018

У меня есть bean-компонент Spring (ChildBean extends Parent), который расширяет абстрактный класс (Parent implements Runnable).

public abstract class Parent implements Runnable {
    public final void run() {
        // some code
    }

    public int overridenFunct() {
        // some code
    }
}

Вариант класса дочернего компонента, который вызывает ClassCastException:

@Transactional
@Scope("prototype")    
@Service("beanName")
public class ChildBean extends Parent {
    @Override
    public int overridenFunct() { 
        // some diff code 
    }
}

Все работает нормально, пока я не переопределю публичный неабстрактный метод из родительского класса в дочернем бине.После этого создается ClassCastException, когда я пытаюсь создать экземпляр этого компонента.

Parent p = (Parent) appContext.getBean("beanName");

Объект компонента, возвращаемый getBean(), является экземпляром класса ChildBean (проверено с помощью отладчика).Почему приведение ChildBean объекта к его абстрактному родительскому классу Parent не работает?Таким образом, без overridenFunct(), реализованного в ChildBean, все работает отлично.Может кто-нибудь сказать, в чем здесь проблема?

ОБНОВЛЕНИЕ:

Изменение метода overridingFunct() на защищенное устраняет проблему.Но что, если мне нужно переопределить публичный метод?Это разрешено?Я использую Spring 3.2.8

UPDATE2:

Ну, я не дошел до того, почему переопределение публичного метода в абстрактном родительском объекте вызывает ClassCastException.В качестве решения я сделал следующее: создал интерфейс со всеми открытыми методами с общей логикой, абстрактный класс, который реализует этот интерфейс и все «общие» методы.Затем все дочерние компоненты расширяются из этого абстрактного класса, реализуя его специфическую логику.

1 Ответ

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

Проблема с вашим кодом состоит в том, что appContext.getBean("beanName") не возвращает объект, который наследуется от класса Parent.

Распространенной ошибкой в ​​отношении классов с именами, такими как Parent, является неправильный импорт.Проверьте, импортируете ли вы из правильного пакета.

Если это не решает проблему, убедитесь, что appContext.getBean("beanName") возвращает объект, который, по вашему мнению, делает.Он может вернуть объект Bean, который не наследуется от класса Parent.

Контекст также может даже не содержать ваш объект ChildBean.Убедитесь, что он добавлен в него заранее.

...