Primavera - Error extraño en la Creación de la haba
-
13-09-2019 - |
Pregunta
Cualquier 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
Solución
Sospecho que si ProdMiscDAO
era una interfaz (es?) No tendría este error. Creo que es probable que tenga una clase que se está utilizando un servidor proxy cglib bajo el capó, la magia de realizar, etc., y, al final, no se puede convertir de forma segura a un parametro en una incubadora o constructor. Vuelva a programar a una interfaz y ver si el error desaparece.
Actualizar : ProdMiscDAO
no es una interfaz. Es una clase que se extiende SqlMappedClientDaoSupport
.
Ante esto, recomiendo probar esto:
- Cambiar nombre
ProdMiscDAO
aSqlMappedProdMiscDAO
. - Extracto de una interfaz desde
SqlMappedProdMiscDAO
llamadoProdMiscDAO
(por ejemplo "class SqlMappedProdMiscDAO implements ProdMiscDAO
") - Ir a través de todo el código que utiliza
SqlMappedProdMiscDAO
y el cambio a utilizarProdMiscDAO
. - Configuración de la primavera para crear instancias de un
SqlMappedProdMiscDAO
, el cableado que todas las clases que lo necesitan.
Esto permite que su aplicación DAO para extender aún SqlMappedClientDaoSupport
sino también tener una interfaz. Después de la conmutación de todas las clases para utilizar la interfaz en lugar de la clase, la primavera no tendrá que utilizar cglib proxy con la DAO y el error debería desaparecer.
Otros consejos
Spring utiliza proxies, generados en tiempo de ejecución de las interfaces, para hacer cosas como las transacciones, aspectos, etc. La expresión primavera adecuado para objetos como DAOs, servicios, etc. es comenzar con una interfaz y crear una aplicación concreta. Una vez conseguido eso, usted es libre para generar los proxies de la interfaz, según sea necesario.
Así que por supuesto que tendrá una aplicación DAO concreto, y eso es la libertad de ampliar SqlMapClientDaoSupport si lo desea, sino también crear una interfaz que tiene sus métodos.
Asegúrese de que usted realmente necesita para extender SqlMapClientDaoSupport. Podría ser que la composición y la delegación es un mejor camino a seguir.