OSGI& Spring异常:引起:java.lang.ClassCastException:$ Proxy17无法强制转换为

时间:2012-01-11 16:30:01

标签: java spring osgi

纠正我发布的内容:

在我的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

有人通过这个吗?

3 个答案:

答案 0 :(得分:3)

Spring将围绕您提供的接口创建代理,并使用my.package.DefaultCustomerProviderImpl作为后备实现。您必须编程到接口而不是实现。

如果您自己编码,它看起来像这样

public class DefaultCustomerProviderProxy implements DefaultCustomerProvider {

  DefaultCustomerProvider delegate;//DefaultCustomerProviderImpl customerProviderImpl instance

  @Override
  public void interfaceMethod1(){
     doSomeSpringStuffMaybeOpenTransaction();

     delegate.interfaceMethod1();

     doSomeSringStuffMaybeCloseTransaction();
  }
}

在实践中,使用Java Proxy

实际上做得更好

所以你可以看到为什么你不能转换为你定义的实现。

答案 1 :(得分:0)

与您的问题无关的一件事

我不太了解Spring注释,但是如果您用于自动装配的那个是正确的,那么您应该永远不需要在id中使用id testCustomerProviderImpl显式指定customerProviderImpl属性。应该要求其中一个。

提出你的问题,从未遇到过这样的情况,但上面提出的观点可能会成为罪魁祸首。

如果仍然遇到同样的问题,请使用代理设计模式来解决问题。

答案 2 :(得分:0)

无需键入强制转换为DefaultCustomerProviderImpl。这违背了界面开发的目的。你的代码应该是这样的

DefaultCustomerProvider customer = this.getCustomerProviderImpl();

Spring环境将确保在运行时注入正确的实现类。