java spring dependency-injection java-ee-6 cglib

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:

  1. Cambie el nombre de ProdMiscDAO a SqlMappedProdMiscDAO .
  2. Extraiga una interfaz de SqlMappedProdMiscDAO llamado ProdMiscDAO (por ejemplo, " class SqlMappedProdMiscDAO implements ProdMiscDAO ")
  3. SqlMappedProdMiscDAO todo el código que usa SqlMappedProdMiscDAO y cámbielo para usar ProdMiscDAO .
  4. 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.