Spring - Erreur dans la création étrange Bean
-
13-09-2019 - |
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
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:
- Renommer
ProdMiscDAO
àSqlMappedProdMiscDAO
. - Extraire une interface de
SqlMappedProdMiscDAO
nomméeProdMiscDAO
(par exemple "class SqlMappedProdMiscDAO implements ProdMiscDAO
") - Allez dans tout votre code qui utilise
SqlMappedProdMiscDAO
et changer pour utiliserProdMiscDAO
. - 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.