天天看點

org.apache.ibatis.binding.BindingException: Parameter XXX not found.的問題

今天在學springcloud alibaba seata時,遇到一個問題。

業務流程是:建立訂單調用庫存服務扣減庫存,調用賬戶服務扣減賬戶餘額,最後修改訂單狀态

有三個服務,訂單order服務,庫存storage服務和賬戶account服務;

将三個服務注冊進alibaba的nacos,啟動nacos,再啟動seata,seata用來管理分布式服務間的事務

進行測試時候報錯:org.apache.ibatis.binding.BindingException: Parameter 'count' not found.

檢視報錯内容得知,是在dao中傳參

void decrease(@Param("productId") Long productId, @Param("count") Integer count);
           

對應的mapper

<update id="decrease">
        update t_storage
        set used = used + #{count},residue = residue - #{count}
        where  product_id= #{productId};
    </update>
           

如果沒有添加@Param注解,Mybatis傳遞參數是按位置傳遞的,也就是說下面一個接口:public User find(String name, String password), XML中使用參數是這樣的select * from user where name = #{0} and password = #{1}。但是我這裡添加了@Param注解但是依然報錯。

可以确認問題就是出在這裡,經過檢視發現,項目中的服務調用是采用的OpenFeign,OpenFeign也有@Param的注解,在引入包的時候沒有仔細看,導緻引入的是OpenFeign的@Param,Mybatis識别不出來,是以預設為是按位置來識别參數,導緻出錯。

總結:編碼時候一定要細心,一個粗心或許會浪費你很多寶貴的時間呐!