【问题标题】:Caused by: java.lang.ClassCastException: $ProxyX cannot be cast to my.package.DefaultCustomerProviderImpl引起:java.lang.ClassCastException:$ProxyX 无法转换为 my.package.DefaultCustomerProviderImpl
【发布时间】:2012-02-01 14:08:29
【问题描述】:

在我的 java 类中,我有:

@Autowired
@Qualifier("customerProviderExec")
private DefaultCustomerProvider customerProvider;

在我的上下文配置 XML 中

<bean id="customerProviderExec" class="my.package.DefaultCustomerProviderExecutor">
    <property name="defaultCustomerProviderService" ref="customerProviderImpl" />   
</bean> 

<bean id="testCustomerProviderImpl" class="my.package.DefaultCustomerProviderTest">
    <property name="customerProviderImpl" ref="customerProviderImpl" />
</bean>    

<bean id="customerProviderImpl" class="my.package.DefaultCustomerProviderImpl">
    ...
</bean>

重要:类 DefaultCustomerProviderImpl 实现 DefaultCustomerProvider

当我尝试在我的 Java 类中执行时:

DefaultCustomerProviderExecutor executor = (DefaultCustomerProviderExecutor)this.getCustomerProvider();
return (DefaultCustomerProviderImpl) executor.getDefaultCustomerProviderService();      

我得到错误:

原因:java.lang.ClassCastException:$Proxy17 无法转换为 my.package.DefaultCustomerProviderImpl

有人经历过这个吗?

【问题讨论】:

标签: java spring


【解决方案1】:
return (DefaultCustomerProvider) executor.getDefaultCustomerProviderService();

强制转换为实现是违反定义接口的意义。

【讨论】:

    【解决方案2】:

    为什么要将接口转换为它的实现?接口是为了防止这种情况。您通常应该只使用接口。

    由于默认情况下 Spring 不为类生成代理,只有 Java 代理,所以你从上下文中获取的 bean 实现了 bean 的所有接口,但不扩展 bean 本身(原始 bean 仅由代理包装)。

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 2017-07-07
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多