Вопрос

Есть какие-нибудь идеи, почему я получаю это исключение?

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.

Учитывая это, я рекомендую попробовать это:

  1. Переименовать ProdMiscDAO Для SqlMappedProdMiscDAO.
  2. Извлечь интерфейс из SqlMappedProdMiscDAO названный ProdMiscDAO (например,"class SqlMappedProdMiscDAO implements ProdMiscDAO")
  3. Просмотрите весь ваш код, который использует SqlMappedProdMiscDAO и измените его, чтобы использовать ProdMiscDAO.
  4. Настройте spring для создания экземпляра SqlMappedProdMiscDAO, подключая к нему все классы, которые в этом нуждаются.

Это позволяет вашей реализации DAO по-прежнему расширяться SqlMappedClientDaoSupport но также иметь интерфейс.После переключения всех классов на использование интерфейса вместо класса Spring не придется использовать cglib для прокси вашего DAO, и ошибка должна исчезнуть.

Другие советы

Spring использует прокси, генерируемые во время выполнения из интерфейсов, для выполнения таких действий, как транзакции, аспекты и т.д.Правильная идиома Spring для таких объектов, как DAO, сервисы и т.д.заключается в том, чтобы начать с интерфейса и создать конкретную реализацию.Получив это, вы можете свободно генерировать прокси из интерфейса по мере необходимости.

Таким образом, конечно, у вас будет конкретная реализация DAO, и вы можете свободно расширять SqlMapClientDaoSupport, если хотите, но также создавать интерфейс, который имеет ваши методы.

Убедитесь, что вам действительно нужно расширить SqlMapClientDaoSupport.Возможно, что состав и делегирование полномочий - это лучший путь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top