spring transaction 註解方法報錯Can not set field to proxy

應用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小學生,不當請指正)


發佈了43 篇原創文章 · 獲贊 6 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章