最近在使用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方法轉換,eq與雙等號相同功能,可替換--> 3 <if test="flag != null and flag == "Y""><!--"字符轉義--> 4 <if test="flag != null and flag == \"Y\""><!--字符轉義,實測會報錯-->
更深入一點,來看看OGNL語法到底是怎么解析的,導致出現了這個問題。
未完待續。。。