ClassCastException:com.sun.proxy。$ ProxyX无法转换为类

时间:2018-10-22 14:49:11

标签: java spring inject spring-bean

我有一个Spring bean(ChildBean extends Parent),它正在扩展抽象类(Parent implements Runnable)。

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

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

导致ClassCastException的子bean类变体:

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

一切正常,直到我从子bean的父类重写公共非抽象方法为止。之后,当我尝试创建该bean的实例时,抛出ClassCastException。

Parent p = (Parent) appContext.getBean("beanName");
getBean()返回的

Bean对象是一个ChildBean类实例(已通过调试器检查)。为什么将ChildBean对象转换为其抽象父类Parent无效? 因此,如果没有在overridenFunct()中实现ChildBean,一切正常。 有人可以告诉我这是什么问题吗?

更新:

更改受保护的方法overridingFunct()可解决此问题。但是,如果我需要重写公共方法怎么办?可以吗我正在使用Spring 3.2.8

UPDATE2:

好吧,我没有弄清楚为什么抽象父级中重写公共方法会导致ClassCastException。作为解决方案,我做了以下工作:创建一个具有所有具有公共逻辑的公共方法的接口,一个抽象类,该类实现该接口和所有“公共”方法。然后,从该抽象类扩展所有子bean,实现其特定的逻辑。

1 个答案:

答案 0 :(得分:0)

您的代码存在的问题是appContext.getBean("beanName")没有返回从类Parent继承的对象。

关于名称类似于Parent的类的常见错误是错误的导入。 检查是否从正确的软件包中导入。

如果这不能解决问题,请确保appContext.getBean("beanName")返回您认为确实可行的对象。 它可能会返回一个不继承自Parent类的Bean对象。

上下文甚至可能还不包含您的ChildBean对象。确保已将其预先添加。