Spring - Странная ошибка при создании компонента
-
13-09-2019 - |
Вопрос
Есть какие-нибудь идеи, почему я получаю это исключение?
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
Решение
Я подозреваю , что если ProdMiscDAO
был ли это интерфейс (не так ли?) у вас не было бы этой ошибки.Я полагаю, у вас, вероятно, есть класс, который проксируется с использованием cglib под капотом, выполняет магию и т.д.и, в конце концов, он не может быть безопасно приведен к параметру в установщике или конструкторе.Попробуйте запрограммировать интерфейс и посмотрите, исчезнет ли ошибка.
Обновить: ProdMiscDAO
это не интерфейс.Это класс, который расширяет SqlMappedClientDaoSupport
.
Учитывая это, я рекомендую попробовать это:
- Переименовать
ProdMiscDAO
ДляSqlMappedProdMiscDAO
. - Извлечь интерфейс из
SqlMappedProdMiscDAO
названныйProdMiscDAO
(например,"class SqlMappedProdMiscDAO implements ProdMiscDAO
") - Просмотрите весь ваш код, который использует
SqlMappedProdMiscDAO
и измените его, чтобы использоватьProdMiscDAO
. - Настройте spring для создания экземпляра
SqlMappedProdMiscDAO
, подключая к нему все классы, которые в этом нуждаются.
Это позволяет вашей реализации DAO по-прежнему расширяться SqlMappedClientDaoSupport
но также иметь интерфейс.После переключения всех классов на использование интерфейса вместо класса Spring не придется использовать cglib для прокси вашего DAO, и ошибка должна исчезнуть.
Другие советы
Spring использует прокси, генерируемые во время выполнения из интерфейсов, для выполнения таких действий, как транзакции, аспекты и т.д.Правильная идиома Spring для таких объектов, как DAO, сервисы и т.д.заключается в том, чтобы начать с интерфейса и создать конкретную реализацию.Получив это, вы можете свободно генерировать прокси из интерфейса по мере необходимости.
Таким образом, конечно, у вас будет конкретная реализация DAO, и вы можете свободно расширять SqlMapClientDaoSupport, если хотите, но также создавать интерфейс, который имеет ваши методы.
Убедитесь, что вам действительно нужно расширить SqlMapClientDaoSupport.Возможно, что состав и делегирование полномочий - это лучший путь.