2012-01-11 8 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 - javaクラスのサフィックスにはならない4文字;-) – Robin

答えて

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

ことの一つは、私は非常によく春の注釈を認識していないですが、あなたがオートワイヤリングのために使用している1が正しい場合は、明示的に豆にcustomerProviderImplプロパティを指定する必要があったことはありませんid testCustomerProviderImpl。これらの2つのうちの1つが必要です。

あなたの質問には、このような状況に遭遇したことはありませんが、上に挙げたポイントが原因である可能性があります。

同じ問題が引き続き発生する場合は、プロキシデザインパターンを使用して問題を解決してください。

0

キャストをDefaultCustomerProviderImplに入力する必要はありません。これはインターフェイス開発の目的を破っています。あなたのコードは、右の実装クラスは、実行時に注入されていることを確認します。この

DefaultCustomerProvider customer = this.getCustomerProviderImpl();

春の環境のようにする必要があります。

関連する問題