2012-01-11 37 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的環境將確保正確的實現類是在運行時注入。

相關問題