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 进行代理,执行魔术等,最后它不能安全地转换为 setter 或构造函数中的参数。尝试对接口进行编程,看看错误是否消失。

更新ProdMiscDAO不是接口。它是一个扩展类SqlMappedClientDaoSupport

鉴于此,我建议尝试这样做:

  1. 重命名ProdMiscDAOSqlMappedProdMiscDAO.
  2. SqlMappedProdMiscDAO从命名中提取接口ProdMiscDAO(例如“ class SqlMappedProdMiscDAO implements ProdMiscDAO”)
  3. 浏览所有使用的代码SqlMappedProdMiscDAO并将其更改为使用ProdMiscDAO.
  4. 配置 spring 以实例化 a 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 回答