Question

Toute idée pourquoi je me fais cette exception?

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
Était-ce utile?

La solution

Je soupçonne que si ProdMiscDAO était une interface (est-il?), Vous avez pas cette erreur. Je crois que vous avez probablement une classe qui se cglib en utilisant un proxy sous le capot, effectuer la magie, etc., et à la fin il ne peut pas être en toute sécurité à jeter un paramter dans un compositeur ou d'un constructeur. Essayez la programmation à une interface et voir si l'erreur disparaît.

Mise à jour : ProdMiscDAO n'est pas une interface. Il est une classe qui étend SqlMappedClientDaoSupport.

Compte tenu de cela, je recommande d'essayer ceci:

  1. Renommer ProdMiscDAO à SqlMappedProdMiscDAO.
  2. Extraire une interface de SqlMappedProdMiscDAO nommée ProdMiscDAO (par exemple "class SqlMappedProdMiscDAO implements ProdMiscDAO")
  3. Allez dans tout votre code qui utilise SqlMappedProdMiscDAO et changer pour utiliser ProdMiscDAO.
  4. Configurer le printemps pour instancier un SqlMappedProdMiscDAO, câbler toutes les classes qui en ont besoin.

Cela permet à votre mise en œuvre de DAO pour étendre encore SqlMappedClientDaoSupport mais aussi d'avoir une interface. Après le passage sur toutes les classes d'utiliser l'interface au lieu de la classe, le printemps sera pas à utiliser cglib pour proxy votre DAO et l'erreur devrait disparaître.

Autres conseils

Spring utilise des procurations, générés lors de l'exécution d'interfaces, de faire des choses comme les transactions, aspects, etc. Le bon langage de printemps pour les objets comme OTI, services, etc. est de commencer par une interface et créer une mise en œuvre concrète. Une fois que vous avez, vous êtes libre de générer des procurations de l'interface selon les besoins.

Alors bien sûr, vous aurez une implémentation DAO en béton, et qui est libre d'étendre SqlMapClientDaoSupport si vous le souhaitez, mais aussi créer une interface qui a vos méthodes.

Assurez-vous que vous avez vraiment besoin d'étendre SqlMapClientDaoSupport. Il se pourrait que la composition et la délégation est une meilleure façon d'aller.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top