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方法轉換,eq與雙等號相同功能,可替換-->
3 <if test="flag != null and flag == &quot;Y&quot;"><!--&quot;字符轉義-->
4 <if test="flag != null and flag == \"Y\""><!--字符轉義,實測會報錯-->

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

未完待續。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM