2009-09-23 21 views
7

Każdy pomysł, dlaczego otrzymuję ten wyjątek?Spring - Weird Error in Bean Creation

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 

Odpowiedz

18

Podejrzewam, że jeśli ProdMiscDAO był interfejs (to jest?) Nie będzie musiał tego błędu. Sądzę, że prawdopodobnie masz klasę, która dostaje proxy za pomocą cglib pod maską, wykonując magię, itp. Iw końcu nie może być bezpiecznie rzucona do paramtera w setera lub konstruktora. Spróbuj zaprogramować interfejs i sprawdź, czy błąd zniknął.

Aktualizacja: ProdMiscDAO nie jest interfejsem. Jest to klasa, która rozszerza SqlMappedClientDaoSupport.

Biorąc to pod uwagę, polecam próbując w ten sposób:

  1. Rename ProdMiscDAO do SqlMappedProdMiscDAO.
  2. Extract interfejs z SqlMappedProdMiscDAO nazwie ProdMiscDAO (na przykład „class SqlMappedProdMiscDAO implements ProdMiscDAO”)
  3. Przejście całego kodu, który wykorzystuje SqlMappedProdMiscDAO i zmienić go używać ProdMiscDAO.
  4. Skonfiguruj sprężynę, aby utworzyć instancję SqlMappedProdMiscDAO, podłączając wszystkie klasy, które jej potrzebują.

Dzięki temu Twoja implementacja DAO nadal będzie rozszerzana o SqlMappedClientDaoSupport, ale także będzie mieć interfejs. Po przełączeniu wszystkich klas, aby korzystać z interfejsu zamiast klasy, Spring nie będzie musiał używać cglib do proxy DAO, a błąd powinien zniknąć.

+0

Tak, nie jest to interfejs. Jest to w rzeczywistości klasa rozszerzająca Spring 'SqlMapClientDaoSupport'. Ale pochodzi z trzeciej strony. Czy jest możliwe, aby uniknąć tego błędu, ponieważ nie będę w stanie edytować słoik :( – peakit

+0

Nie można wyodrębnić interfejs z ProdMiscDAO? Na przykład można zmienić nazwę ProdMiscDAO na SqlMappedProdMiscDAO lub SpringProdMiscDAO, a następnie wyodrębnić interfejs o nazwie ProdMiscDao i czy twoje klasy korzystają z interfejsu? Wiosna tworzy instancję klasy (która nadal rozszerza SqlMapClientDaoSupport), ale przekazuje ją do czegoś, co oczekuje interfejsu .. – SingleShot

+0

SingleShot .. Dam ci to spróbować. Ale czy mógłbyś wyjaśnić mi głębiej, co to jest Przyczyna błędu? Mam na myśli, że nie dostałem tego kompletnie .. przepraszam za to :) – peakit

4

Spring używa serwerów proxy, generowanych w czasie wykonywania z interfejsów, do robienia rzeczy takich jak transakcje, aspekty, itp. Właściwy idiom Spring dla obiektów takich jak DAO, usługi, itp. To rozpoczęcie z interfejsem i stworzenie konkretnej implementacji . Kiedy już to zrobisz, możesz generować proxy z poziomu interfejsu w razie potrzeby.

Oczywiście będziesz miał konkretną implementację DAO, a jeśli chcesz, możesz rozszerzyć SqlMapClientDaoSupport, ale także utworzyć interfejs, który ma twoje metody.

Upewnij się, że naprawdę potrzebujesz rozszerzyć SqlMapClientDaoSupport. Być może lepsza jest kompozycja i delegacja.

+0

duffymo, problem polega na tym, że wszystkie te rzeczy pochodzą ze słoja firm trzecich i nie będę w stanie edytować niczego. Czy jest jakikolwiek sposób obejścia tego problemu? – peakit

+0

Głosowałem za udzieleniem odpowiedzi SingleShot. Myślę, że to pierwsza rzecz, której należy spróbować. Jego odpowiedź jest doskonała; Nie mogę tego poprawić. – duffymo

Powiązane problemy