java - Spring-Error extraño en la creación de frijoles
dependency-injection java-ee-6 (2)
Sospecho que si ProdMiscDAO
fuera una interfaz (¿verdad?) No tendrías este error. Creo que es probable que tengas una clase que obtenga un proxy utilizando cglib debajo del capó, realizando magia, etc. y al final no se puede convertir con seguridad en un parámetro en un setter o constructor. Intente programar en una interfaz y vea si el error desaparece.
Actualización : ProdMiscDAO
no es una interfaz. Es una clase que extiende SqlMappedClientDaoSupport
.
Dado esto, recomiendo probar esto:
- Cambie el nombre de
ProdMiscDAO
aSqlMappedProdMiscDAO
. - Extraiga una interfaz de
SqlMappedProdMiscDAO
llamadoProdMiscDAO
(por ejemplo, "class SqlMappedProdMiscDAO implements ProdMiscDAO
") -
SqlMappedProdMiscDAO
todo el código que usaSqlMappedProdMiscDAO
y cámbielo para usarProdMiscDAO
. - Configure Spring para instanciar un
SqlMappedProdMiscDAO
,SqlMappedProdMiscDAO
todas las clases que lo necesiten.
Esto le permite a su implementación DAO extender aún SqlMappedClientDaoSupport
pero también tener una interfaz. Después de cambiar todas las clases para usar la interfaz en lugar de la clase, Spring no tendrá que usar cglib para proxy su DAO y el error debería desaparecer.
¿Alguna idea de por qué estoy recibiendo esta excepción?
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
Spring usa proxies, generados en tiempo de ejecución desde las interfaces, para hacer cosas como transacciones, aspectos, etc. La expresión apropiada de Spring para objetos como DAO, servicios, etc. es comenzar con una interfaz y crear una implementación concreta. Una vez que tenga eso, puede generar proxies desde la interfaz según sea necesario.
Así que, por supuesto, tendrá una implementación concreta de DAO, y eso es gratis para extender SqlMapClienteDaoSupport si lo desea, pero también puede crear una interfaz que tenga sus métodos.
Asegúrese de que realmente necesita extender SqlMapClientDaoSupport. Podría ser que la composición y la delegación es una mejor forma de avanzar.