今天在學(xué)springcloud alibaba seata時(shí),遇到一個(gè)問題。
業(yè)務(wù)流程是:創(chuàng)建訂單調(diào)用庫(kù)存服務(wù)扣減庫(kù)存,調(diào)用賬戶服務(wù)扣減賬戶余額扮念,最后修改訂單狀態(tài)
有三個(gè)服務(wù),訂單order服務(wù)碧库,庫(kù)存storage服務(wù)和賬戶account服務(wù)柜与;
將三個(gè)服務(wù)注冊(cè)進(jìn)alibaba的nacos,啟動(dòng)nacos嵌灰,再啟動(dòng)seata弄匕,seata用來管理分布式服務(wù)間的事務(wù)
進(jìn)行測(cè)試時(shí)候報(bào)錯(cuò):org.apache.ibatis.binding.BindingException: Parameter 'count' not found.
查看報(bào)錯(cuò)內(nèi)容得知,是在dao中傳參
void decrease(@Param("productId") Long productId, @Param("count") Integer count);
對(duì)應(yīng)的mapper
<update id="decrease">
update t_storage
set used = used + #{count},residue = residue - #{count}
where product_id= #{productId};
</update>
如果沒有添加@Param注解沽瞭,Mybatis傳遞參數(shù)是按位置傳遞的迁匠,也就是說下面一個(gè)接口:public User find(String name, String password), XML中使用參數(shù)是這樣的select * from user where name = #{0} and password = #{1}。但是我這里添加了@Param注解但是依然報(bào)錯(cuò)驹溃。
可以確認(rèn)問題就是出在這里稳摄,經(jīng)過查看發(fā)現(xiàn)僵娃,項(xiàng)目中的服務(wù)調(diào)用是采用的OpenFeign跌捆,OpenFeign也有@Param的注解鸭廷,在引入包的時(shí)候沒有仔細(xì)看,導(dǎo)致引入的是OpenFeign的@Param布疙,Mybatis識(shí)別不出來蚊惯,所以默認(rèn)為是按位置來識(shí)別參數(shù),導(dǎo)致出錯(cuò)灵临。
總結(jié):編碼時(shí)候一定要細(xì)心截型,一個(gè)粗心或許會(huì)浪費(fèi)你很多寶貴的時(shí)間吶!