mybatis 报错:Cause: java.lang.NumberFormatException: For input string: "Y"

最近在使用SSM框架时遇到一个问题,通过排查可以发现问题出现在一句mybatis的 if 查询条件,但从代码逻辑始终没有发现任何问题,反复验证之后确定应该是代码在转换解析时异常。

出错的代码很简单:

 1 <select  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语法到底是怎么解析的,导致出现了这个问题。

未完待续。。。