Spring - Erro estranho no feijão Criação
-
13-09-2019 - |
Pergunta
Qualquer idéia por que estou recebendo essa exceção?
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
Solução
Eu suspeito que se ProdMiscDAO
foi uma interface (é?) Você não teria esse erro. Eu acredito que você provavelmente tem uma classe que está sendo proxy usando cglib sob o capô, realizando magia, etc. e, no final, não pode ser convertido com segurança a um paramter em um setter ou construtor. Tente programar para uma interface e ver se o erro desaparece.
Atualização : ProdMiscDAO
não é uma interface. É uma classe que estende SqlMappedClientDaoSupport
.
Diante disso, eu recomendo tentar este:
- Rename
ProdMiscDAO
paraSqlMappedProdMiscDAO
. - Extrato de uma interface de
SqlMappedProdMiscDAO
chamadoProdMiscDAO
(por exemplo, "class SqlMappedProdMiscDAO implements ProdMiscDAO
") - Vá até todo o seu código que usa
SqlMappedProdMiscDAO
e alterá-lo para usoProdMiscDAO
. - Configurar mola para instanciar um
SqlMappedProdMiscDAO
, fiação-lo todas as classes que necessitam.
Isso permite que sua implementação DAO ainda estender SqlMappedClientDaoSupport
mas também para ter uma interface. Depois da comutação todas as classes de usar a interface em vez da classe, Primavera não terá que usar cglib de proxy para DAO e o erro deve ir embora.
Outras dicas
Spring usa proxies, gerados em tempo de execução das interfaces, para fazer coisas como transações, aspectos, etc. O idioma Primavera adequado para objetos como DAOs, serviços, etc. é começar com uma interface e criar uma implementação concreta. Uma vez que você tem isso, você está livre para gerar proxies a partir da interface conforme necessário.
Então é claro que você vai ter uma implementação concreta DAO, e isso é livre para estender SqlMapClientDaoSupport se quiser, mas também criar uma interface que tem seus métodos.
Certifique-se de que você realmente precisa para estender SqlMapClientDaoSupport. Pode ser que a composição e a delegação é a melhor maneira de ir.