1. 程式人生 > 實用技巧 >mybatis 報錯:Cause: java.lang.NumberFormatException: For input string: "Y"

mybatis 報錯:Cause: java.lang.NumberFormatException: For input string: "Y"

最近在使用SSM框架時遇到一個問題,通過排查可以發現問題出現在一句mybatis的if查詢條件,但從程式碼邏輯始終沒有發現任何問題,反覆驗證之後確定應該是程式碼在轉換解析時異常。

出錯的程式碼很簡單:

 1 <select id="selectByFlag" resultMap="BaseResultMap" parameterType="HashMap">
 2     select
 3     *
 4     from userinfo
 5     <where>
 6       <if test="flag != null and flag == 'Y'"
> <!--這裡報錯NumberFormatException--> 7 AND flag = 'Y' 8 </if> 9 </where> 10 </select>

問題的原因在於mybiatis是基於OGNL語法,在解析單引號+單字元'Y'的解析時會預設時char型別,單引號+多字元'AA'或者雙引號+單字元"A"解析為String型別。

所以上面的報錯也很好理解了,NumberFormatException在將字元轉換成數字時報錯,所以這裡如果使用數字的話,就不會有任何問題。

解決方法也很簡單,可以參考

這篇文章這篇文章。

大概思路就是通過轉換編碼,使單字元能夠被正確解析。

1 <if test='flag != null and flag == "Y"'><!--單雙引號互換位置-->
2 <if test="flag != null and flag eq 'Y'.toString()"><!--通過toString方法轉換-->
3 <if test="flag != null and flag == &quot;A&quot;"><!--&quot;字元轉義-->
4 <if test
="flag != null and flag == \"Y\""><!--字元轉義-->

更深入一點,來看看OGNL語法到底是怎麼解析的,導致出現了這個問題。

未完待續。。。