7

この例外が発生する理由は何ですか?

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
4

2 に答える 2

18

もしProdMiscDAOインターフェースだったら(そうですか?)、このエラーは発生しないと思います。内部で cglib を使用したり、魔法を実行したりして、最終的にセッターまたはコンストラクターのパラメーターに安全にキャストできないクラスがあると思います。インターフェイスにプログラミングしてみて、エラーが解消されるかどうかを確認してください。

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

これを考えると、これを試すことをお勧めします:

  1. に名前を変更ProdMiscDAOSqlMappedProdMiscDAOます。
  2. SqlMappedProdMiscDAO名前付きProdMiscDAO(例: " class SqlMappedProdMiscDAO implements ProdMiscDAO")からインターフェースを抽出します。
  3. を使用するすべてのコードを確認し、使用SqlMappedProdMiscDAOするように変更しますProdMiscDAO
  4. をインスタンス化するようにSpringを構成しSqlMappedProdMiscDAO、それを必要とするすべてのクラスに接続します。

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

于 2009-09-23T21:43:23.160 に答える
4

Spring は、インターフェイスから実行時に生成されるプロキシを使用して、トランザクションやアスペクトなどを実行します。DAO やサービスなどのオブジェクトに対する適切な Spring のイディオムは、インターフェイスから開始して具体的な実装を作成することです。それができたら、必要に応じてインターフェイスからプロキシを自由に生成できます。

もちろん、具体的な DAO の実装があり、必要に応じて SqlMapClientDaoSupport を自由に拡張できますが、メソッドを持つインターフェイスも作成できます。

本当に SqlMapClientDaoSupport を拡張する必要があることを確認してください。構成と委任がより良い方法である可能性があります。

于 2009-09-23T22:01:02.167 に答える