天天看點

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;

implementation implementaion;

@qualifier("implementation") 

interface implementaion;

這三種方法在大多數時候不會引起麻煩。但是應用場景略有不同。如果接口+執行個體的模型中,執行個體不止一個,隻能用後面兩種;但是後面兩種的第二種是針對接口的,第一種是針對類的。是以用第一(一個執行個體)和第三種方法初始化。

上面兩種解決方案我傾向于第二種,因為有時候我們需要加入斷點以調試。第一種方法在transaction裡加入斷點會出現cannot set breakpoint類似的錯誤。

(我是java國小生,不當請指正)