2009-09-23 11 views
7

なぜこの例外が発生するのでしょうか?Bean Creationでの奇妙なエラー

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myService' defined in class path resource [context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy54 implementing org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,net.sf.cglib.proxy.Factory,org.springframework.beans.factory.InitializingBean] to required type [com.mycompany.service.dao.MyDAO] for property 'myDAO'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy54 implementing org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,net.sf.cglib.proxy.Factory,org.springframework.beans.factory.InitializingBean] to required type [com.mycompany.service.dao.MyDAO] for property 'myDAO': no matching editors or conversion strategy found 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:671) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:610) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:499) 
    ... 36 more 
Caused by: java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy54 implementing org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,net.sf.cglib.proxy.Factory,org.springframework.beans.factory.InitializingBean] to required type [com.mycompany.service.dao.MyDAO] for property 'myDAO': no matching editors or conversion strategy found 
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:231) 
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:138) 
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:386) 
... 62 more 

答えて

18

私はProdMiscDAOインターフェイス(それがある?)だった場合は、このエラーを持っていないだろうと思われます。私はあなたがおそらく、フードの下でcglibを使ってプロキシになったり、魔法を実行したりするクラスを持っていると信じています。そして、結局、セッターやコンストラクタの中のパラメタに安全にキャストすることはできません。インターフェイスにプログラミングし、エラーがなくなるかどうか確認してください。

更新ProdMiscDAOはインターフェイスではありません。それはSqlMappedClientDaoSupportを拡張するクラスです。

はこのことを考えると、私はこれをお試しください:

  1. SqlMappedProdMiscDAOProdMiscDAOの名前を変更します。
  2. SqlMappedProdMiscDAOを使用して、すべてのコードを移動して、ProdMiscDAOを使用するように変更
  3. ProdMiscDAO(例えば「class SqlMappedProdMiscDAO implements ProdMiscDAO」)という名前SqlMappedProdMiscDAOからインターフェイスを抽出します。
  4. SqlMappedProdMiscDAOをインスタンス化するようにspringを設定し、必要なすべてのクラスを配線します。

このようにすると、DAOの実装でもSqlMappedClientDaoSupportが拡張されますが、インターフェイスも使用できます。クラスの代わりにインタフェースを使うようにすべてのクラスを切り替えた後、SpringはあなたのDAOをプロキシするためにcglibを使う必要はなく、エラーはなくなるはずです。

+0

はいそれはインターフェイスではありません。実際には、Springの 'SqlMapClientDaoSupport'を拡張したクラスです。しかし、それは第三者から来ている。 ( – peakit

+0

ProdMiscDAOからインターフェイスを抽出できないのですか?たとえば、ProdMiscDAOの名前をSqlMappedProdMiscDAOまたはSpringProdMiscDAOに変更してから、ProdMiscDaoという名前のインターフェイスを抽出し、あなたのクラスはインターフェイスを使用していますか?Springはクラス(SqlMapClientDaoSupportを継承しています)をインスタンス化しますが、インターフェイスが必要なものに渡します。 – SingleShot

+0

SingleShot ..これを試してみます。エラーの原因は?私はこれを完全に取得しなかったことを意味します。それについて申し訳ありません:) – peakit

4

Springは、トランザクション、アスペクトなどを実行するために、インタフェースから実行時に生成されるプロキシを使用します。DAOやサービスなどのオブジェクトの適切なSpringイディオムは、インタフェースから始まり、 。いったんこれを取得すれば、必要に応じてインターフェイスからプロキシを自由に生成できます。

もちろん、具体的なDAOの実装がありますが、これはSqlMapClientDaoSupportを自由に拡張するだけでなく、メソッドを持つインターフェイスを作成することもできます。

本当にSqlMapClientDaoSupportを拡張する必要があることを確認してください。コンポジションとデリゲートはより良い方法です。

+0

ダフィーモ、問題は、このすべてのものがサードパーティ製のジャーから来ていて、何も編集できないということです。 この問題を回避する方法はありますか? – peakit

+0

私はSingleShotの返事に投票しました。私はこれが最初の試みだと思います。彼の答えは素晴らしいです。私はそれを改善することはできません。 – duffymo