【问题标题】:ClassCastException: com.sun.proxy.$ProxyX cannot be cast to a classClassCastException:com.sun.proxy.$ProxyX 无法转换为类
【发布时间】:2019-03-26 16:38:16
【问题描述】:

我有一个 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 不起作用? 因此,如果没有在ChildBean 中实现overridenFunct(),一切正常。 有人可以告诉这里有什么问题吗?

更新:

将方法overridingFunct() 更改为受保护可修复该问题。但是如果我需要重写一个公共方法呢?这是允许的吗?我正在使用 Spring 3.2.8

更新 2:

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

【问题讨论】:

  • 你能说明Parent的定义吗?
  • @flakes,不幸的是,出于安全原因,我无法在此处发布该类的代码(加上它有 500 多行)。该类实现了可运行并用于向另一个节点发送一些定期请求。它使用了一些其他注入的资源(不确定这是否有用......)。
  • 您需要发布更多信息以获得正确答案。如果您无法发布代码,请尝试使用最小可行示例重现您的问题,然后发布。
  • 我键入了您的示例代码以尝试重现。但是,我无法重现您的 ClassCastException。更改为被保护可能会解决问题,但这不是正确的答案。还有其他问题。
  • @BrentR,感谢您的尝试。我将处理可以重现问题的代码快照...

标签: java spring inject spring-bean


【解决方案1】:

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

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

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

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

【讨论】:

  • 类名只是这里的例子。是的,上下文包含所需的 bean。正如我在描述中已经提到的,当尝试将 getBean() 返回的对象强制转换为 Parent 时,会引发 ClassCastException。
  • 更新了我的答案......我猜你得到的是一个通用的 Bean 对象,而不是你的 ChildBean 类之一......
  • 也更新了描述。我从getBean() 得到的对象是ChildBean 的一个实例。所以我的问题是为什么当我在ChildBean 中重写了公共非抽象方法时,转换为Parent 类不起作用?
猜你喜欢
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2015-07-14
相关资源
最近更新 更多