應用Spring典型場景:接口+實現,初始化時自動注入。
應用transaction註解方法的典型場景:接口+實現,在實現整個類上加註解或一個特定方法上加註解。
運行時出現這樣的錯誤:
Caused by: java.lang.IllegalArgumentException: Can not set xxxxxx field yyyyyy to com.sun.proxy.$ProxyNNNNNN
出現錯誤原因:
代碼中出現了對實現的初始化,而配置文件中沒有將AOP由默認的針對接口設置成針對類的。因此有兩種解決方法:
一、配置文件中將
<tx:annotation-driven transaction-manager="transactionManager"/>
改成
<tx:annotation-driven transaction-manager="transactionManager" target-class-proxy="true"/>
這樣就把默認爲針對接口的AOP就變成了針對類的。
二、修改初始化的方法
自動注入我目前接觸了三種方法初始化:
@Autowired
Interface interface;
@Autowired
Implementation implementaion;
@Autowired
@Qualifier("implementation")
Interface implementaion;
這三種方法在大多數時候不會引起麻煩。但是應用場景略有不同。如果接口+實例的模型中,實例不止一個,只能用後面兩種;但是後面兩種的第二種是針對接口的,第一種是針對類的。所以用第一(一個實例)和第三種方法初始化。
上面兩種解決方案我傾向於第二種,因爲有時候我們需要加入斷點以調試。第一種方法在transaction里加入斷點會出現cannot set breakpoint類似的錯誤。
(我是JAVA小學生,不當請指正)