1. 程式人生 > >關於Autowiring Class Issue (argument type mismatch)的問題的解決方法

關於Autowiring Class Issue (argument type mismatch)的問題的解決方法

由於Spring工程涉及到兩個DataSource的原因,加入另外一個DataSource後,在DAO層有其對應的實現,但是沒有寫其對應的Hibernate介面。在Eclipse除錯窗口出現以下錯誤:

Injection of autowired dependencies failed; nestedexception is org.springframework.beans.factory.BeanCreationException: Could notautowire method:
public voidcom.xxx.service.impl.ClientServiceImpl.setXXXDao(com.xxx.dao.XXXDAO);
nested exception is java.lang.IllegalArgumentException: argument type mismatch

  百思不得其解,各種單步除錯、冥思苦想,整整折騰了一天,後來發現是由於以下原因:

The problem is that by default spring uses JDK proxies (java.lang.reflect.Proxy) which are interface-only proxies. Your concreteclass is then used by the invocation handler, but you cannot cast to it.

If there is nointerface, spring uses another method - CGLIB, which subclasses the targetclass in order to make the proxy.

(http://stackoverflow.com/questions/4957299/spring-3-controller-not-able-to-inject-service-object-which-has-transactional> )

解決方法有二:

1、加入DAO層對應的Hibernate介面,然後讓實現層實現此介面(當然了,在Service層中引用的時候要用DAO層介面!否則要介面還有啥用!!!)

2、在application-dao.xml(名稱不一定完全一樣)配置檔案中,把 <aop:aspectj-autoproxy/> 改成  <aop:aspectj-autoproxyproxy-target-class = "true"/>。

第1種方法肯定是可行的,已驗證通過。

第2種方法spring.io官網論壇還有StackOverflow中都有人提及,但是我未驗證通過(不知是否是版本問題,特此說明)。

昨天是11.11日,開心每一天!