2012-01-11 72 views
1

纠正我已经发布:

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

有人通过这个?

+0

Impl - 4个字母,不应该是任何java类中的后缀;-) – Robin 2012-01-12 14:43:18

回答

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

所以做更多的不同,你可以看到为什么你不能投你的实现定义。

0

一件事不相关的问题

我不是很清楚地知道Spring注解的,但如果你已经使用了自动装配的是正确的,你应该从来没有与明确指定在bean中customerProviderImpl财产的需要id testCustomerProviderImpl。其中一个应该是必需的。

即将到来的问题,从来没有遇到这样的情况,但可能上面提出的问题有能力成为罪魁祸首。

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

0

没有必要输入DefaultCustomerProviderImpl。这打破了界面开发的目的。您的代码应该是这样的

DefaultCustomerProvider customer = this.getCustomerProviderImpl();

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

相关问题