2009-09-23 13 views
7

Qualche idea del motivo per cui ottengo questa eccezione?Spring - Errore strano nella creazione di bean

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 

risposta

18

Ho il sospetto che se fosse ProdMiscDAO un'interfaccia (è?) Non avreste questo errore. Credo che tu abbia probabilmente una classe che viene sottoposta a proxy usando cglib sotto il cofano, eseguendo la magia, ecc. E alla fine non può essere lanciato in sicurezza a un paramter in un setter o in un costruttore. Prova a programmare su un'interfaccia e vedi se l'errore scompare.

Aggiornamento: ProdMiscDAO non è un'interfaccia. È una classe che estende SqlMappedClientDaoSupport.

Detto questo, vi consiglio di provare questo:

  1. Rinominare ProdMiscDAO a SqlMappedProdMiscDAO.
  2. Estratto un'interfaccia da SqlMappedProdMiscDAO chiamato ProdMiscDAO (ad esempio "class SqlMappedProdMiscDAO implements ProdMiscDAO")
  3. passare attraverso tutto il codice che utilizza SqlMappedProdMiscDAO e cambiarlo per usare ProdMiscDAO.
  4. Configurare la molla per creare un'istanza di SqlMappedProdMiscDAO, collegando tutte le classi che ne hanno bisogno.

Ciò consente all'implementazione DAO di estendere ancora SqlMappedClientDaoSupport ma anche di avere un'interfaccia. Dopo aver passato tutte le classi per usare l'interfaccia al posto della classe, Spring non dovrà usare cglib per eseguire il proxy del tuo DAO e l'errore dovrebbe andare via.

+0

Sì, non è un'interfaccia. In realtà è una classe che estende "SqlMapClientDao Support" di Spring. Ma viene da una terza parte. È possibile evitare questo errore in quanto non sarà in grado di modificare il jar :( – peakit

+0

Impossibile estrarre un'interfaccia da ProdMiscDAO? Ad esempio, è possibile rinominare ProdMiscDAO in SqlMappedProdMiscDAO o SpringProdMiscDAO, quindi estrarre un'interfaccia denominata ProdMiscDao e le tue classi usano l'interfaccia? Spring istanzia la classe (che estende ancora SqlMapClientDaoSupport) ma passa a qualcosa che si aspetta l'interfaccia. – SingleShot

+0

SingleShot .. Darò questo un tentativo .. Ma potresti spiegarmi più profondamente che cosa è il causa dell'errore? Voglio dire non l'ho capito completamente .. scusami per quello :) – peakit

4

Spring utilizza i proxy generati in fase di esecuzione dalle interfacce per eseguire operazioni, aspetti, ecc. Il corretto linguaggio Spring per oggetti come DAO, servizi, ecc. È di iniziare con un'interfaccia e creare un'implementazione concreta . Una volta ottenuto ciò, sei libero di generare proxy dall'interfaccia, se necessario.

Quindi, ovviamente, si avrà un'implementazione DAO concreta, ed è possibile estendere SqlMapClientSupportSupport se lo si desidera, ma creare anche un'interfaccia con i propri metodi.

Assicurarsi di aver davvero bisogno di estendere SqlMapClientDao Support. Potrebbe essere che la composizione e la delega siano un modo migliore di andare.

+0

duffymo, il problema è che questa roba proviene da un vaso di terze parti e non potrò modificare nulla. C'è un modo per aggirare questo problema? – peakit

+0

Ho votato la risposta di SingleShot. Penso che sia la prima cosa da provare. La sua risposta è eccellente; Non posso migliorare. – duffymo

Problemi correlati