2009-09-23 39 views
7

Bất kỳ ý tưởng nào tại sao tôi nhận được ngoại lệ này?Mùa xuân - Lỗi lạ khi tạo 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 

Trả lời

18

Tôi nghi ngờ rằng nếu ProdMiscDAO là giao diện (có phải không?), Bạn sẽ không gặp lỗi này. Tôi tin rằng bạn có thể có một lớp đó là nhận được proxied bằng cách sử dụng cglib dưới mui xe, thực hiện ma thuật, vv và cuối cùng nó không thể được an toàn đúc cho một paramter trong một setter hoặc constructor. Hãy thử lập trình cho một giao diện và xem lỗi có biến mất hay không.

Cập nhật: ProdMiscDAO không phải là giao diện. Nó là một lớp mở rộng SqlMappedClientDaoSupport.

Với điều này, tôi khuyên bạn nên thử điều này:

  1. Đổi tên ProdMiscDAO để SqlMappedProdMiscDAO.
  2. Trích xuất một giao diện từ SqlMappedProdMiscDAO tên ProdMiscDAO (ví dụ "class SqlMappedProdMiscDAO implements ProdMiscDAO")
  3. Đi qua tất cả các mã của bạn có sử dụng SqlMappedProdMiscDAO và thay đổi nó để sử dụng ProdMiscDAO.
  4. Định cấu hình lò xo để khởi tạo SqlMappedProdMiscDAO, nối dây tất cả các lớp cần.

Điều này cho phép triển khai DAO của bạn vẫn mở rộng SqlMappedClientDaoSupport mà còn để có giao diện. Sau khi chuyển qua tất cả các lớp để sử dụng giao diện thay vì lớp, Spring sẽ không phải sử dụng cglib để proxy DAO của bạn và lỗi sẽ biến mất.

+0

Có không phải là giao diện của nó. Lớp thực sự của nó mở rộng 'SqlMapClientDaoSupport' của Spring. Nhưng nó đến từ bên thứ ba. Có thể tránh được lỗi này vì tôi sẽ không thể chỉnh sửa jar được không: ( – peakit

+0

Bạn không thể trích xuất giao diện từ ProdMiscDAO? Ví dụ: bạn có thể đổi tên ProdMiscDAO thành SqlMappedProdMiscDAO hoặc SpringProdMiscDAO, sau đó trích xuất giao diện có tên ProdMiscDao và có lớp học của bạn sử dụng giao diện? Spring sẽ nhanh chóng lớp (mà vẫn mở rộng SqlMapClientDaoSupport) nhưng vượt qua nó để một cái gì đó mà mong đợi giao diện – SingleShot

+0

SingleShot .. Tôi sẽ cung cấp cho một thử .. Nhưng bạn có thể vui lòng giải thích cho tôi sâu sắc hơn whats Tôi có nghĩa là tôi đã không nhận được điều này hoàn toàn .. xin lỗi vì điều đó :) – peakit

4

Sử dụng proxy mùa xuân, được tạo tại thời gian chạy từ giao diện, để thực hiện những thứ như giao dịch, các khía cạnh, v.v. Thành ngữ mùa xuân thích hợp cho các đối tượng như DAO, dịch vụ, v.v. . Một khi bạn có điều đó, bạn được tự do tạo proxy từ giao diện khi cần thiết.

Vì vậy, tất nhiên bạn sẽ có một triển khai DAO cụ thể, và đó là miễn phí để mở rộng SqlMapClientDaoSupport nếu bạn muốn, nhưng cũng tạo ra một giao diện có phương pháp của bạn.

Hãy chắc chắn rằng bạn thực sự cần phải mở rộng SqlMapClientDaoSupport. Nó có thể là thành phần và đoàn đại biểu là một cách tốt hơn để đi.

+0

duffymo, vấn đề là tất cả mọi thứ này đến từ một lọ bên thứ ba và tôi sẽ không thể chỉnh sửa bất cứ thứ gì. Có cách nào tôi có thể giải quyết vấn đề này không? – peakit

+0

Tôi đã bỏ phiếu cho câu trả lời của SingleShot. Tôi nghĩ đó là điều đầu tiên để thử. Câu trả lời của anh ấy là tuyệt vời; Tôi không thể cải thiện nó. – duffymo

Các vấn đề liên quan