2009-09-23 88 views
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 

回答

18

我怀疑如果ProdMiscDAO是一个接口(是吗?)你不会有这样的错误。我相信你可能有一个类正在使用cglib进行代理,执行魔法等,最后它不能安全地转换为setter或构造函数中的参数。尝试编程到界面,看看错误是否消失。

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

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

  1. 重命名ProdMiscDAOSqlMappedProdMiscDAO
  2. 提取的接口从SqlMappedProdMiscDAO命名ProdMiscDAO(例如“class SqlMappedProdMiscDAO implements ProdMiscDAO”)
  3. 经过的所有代码使用SqlMappedProdMiscDAO并将其更改为使用ProdMiscDAO
  4. 配置弹簧来实例化一个SqlMappedProdMiscDAO,连接所有需要它的类。

这允许您的DAO实现仍然扩展SqlMappedClientDaoSupport,但也有一个接口。在切换所有类以使用接口而不是类之后,Spring将不必使用cglib来代理您的DAO,并且错误应该消失。

+0

是的,它不是一个接口。它实际上是一个扩展Spring的'SqlMapClientDaoSupport'的类。但它来自第三方。是否有可能避免这种错误,因为我将无法编辑罐子:( – peakit 2009-09-23 21:47:42

+0

你能不能从ProdMiscDAO提取的接口?例如,你可以重命名ProdMiscDAO到SqlMappedProdMiscDAO或SpringProdMiscDAO,然后提取名为ProdMiscDao的接口和你的类是否使用接口?Spring会实例化这个类(它仍然扩展了SqlMapClientDaoSupport),但是将它传递给接口。 – SingleShot 2009-09-23 21:52:16

+0

SingleShot ..我会试试这个..但是请你更深入地解释一下错误的原因是什么?我的意思是我没有完全搞定这个..对不起对于:) – peakit 2009-09-23 21:56:59

4

Spring使用从接口运行时生成的代理来完成事务,方面等事情。像DAO,服务等对象的适当的Spring成语是从一个接口开始并创建一个具体的实现。一旦你有了,你可以根据需要自由地从界面生成代理。

所以当然你会有一个具体的DAO实现,如果你愿意,可以自由地扩展SqlMapClientDaoSupport,但也可以创建一个包含你的方法的接口。

确保您确实需要扩展SqlMapClientDaoSupport。这可能是组成和授权是更好的方式。

+0

duffymo,问题是这些东西都来自第三方jar,我将无法编辑任何东西。 有什么办法可以解决这个问题吗? – peakit 2009-09-23 23:04:04

+0

我投了SingleShot的回复。我认为这是第一次尝试。他的回答非常好。我无法改进它。 – duffymo 2009-09-23 23:38:28