Mybatis java.lang.NumberFormatException: For input string: "1,2"

问题背景

今天在开发过程中,项目请求报了一个错,错误信息【java.lang.NumberFormatException: For input string: “1,2”】,最初看到这个报错还挺奇怪的,在Mybatis xml 中比较值双方都是字符串,但是为什么会出现一个字符串强转数值类型的报错。后来查找了相关文档,找到了具体原因,那么由于之前未曾遇到类似情况,这里便记录一下问题解决方案。

问题分析

报错位置 Mybatis xml 代码如下,Mybatis 在进行参数 == 比较时,会将常量类型的 ‘1’ 强转为数值类型进行比较,而 params.selectParam 的参数内容是 String 类型,这样导致 Mybatis 比较失败,当遇到 ‘1,2’ 时,则会直接报错 java.lang.NumberFormatException: For input string: “1,2” ,强转数值类型失败,因为 “1,2” 本身是一个字符串,并不能直接转换为 数值类型,而在进行 “1” 或者 “2” 比较时,虽然你觉得是字符串之间的比较,但是实际是强转数值类型之后的比较,但是因为本身都是数字,并不会被发现这样的转换

<choose>
		<when test="params.selectParam == '1'">
			GROUP BY t2.channel_type
		</when>
		<when test="params.selectParam == '2'">
			GROUP BY t3.dept_id
		</when>
		<when test="params.selectParam == '1,2'">
			GROUP BY t2.channel_type,t3.dept_id
		</when>
		<otherwise>
			GROUP BY t2.channel_type
		</otherwise>
</choose>

问题处理

当出现了“1,2” 这样的字符串时,再想强转数值类型的话,就一定会报错的。那么找到问题之后,此时就有两种解决方案:

一种是将常量类型的 ‘1’ 通过 .toString() 转为 String 类型,这样就可以与 params.selectParam 的参数内容是 String 类型的内容进行正常比较了,示例代码如下

<choose>
    <when test="params.selectParam == '1'.toString()">
      GROUP BY t2.channel_type
    </when>
    <when test="params.selectParam == '2'.toString()">
      GROUP BY t3.dept_id
    </when>
    <when test="params.selectParam == '1,2'.toString()">
      GROUP BY t2.channel_type,t3.dept_id
    </when>
    <otherwise>
      GROUP BY t2.channel_type
    </otherwise>
</choose>

另一种方案就是修改 test=“params.selectParam == ‘1’” 的 “” 变 ‘’ ,而内部常量值的 ‘’ 变成 “”,也就是在写xml 时将 字符串的 单引号变成双引号,处理后就是这样了

<choose>
		<when test='params.selectParam == "1"'>
			GROUP BY t2.channel_type
		</when>
		<when test='params.selectParam == "2"'>
			GROUP BY t3.dept_id
		</when>
		<when test='params.selectParam == "1,2"'>
			GROUP BY t2.channel_type,t3.dept_id
		</when>
		<otherwise>
			GROUP BY t2.channel_type
		</otherwise>
</choose>

这种方案也是可行的,亲测有效,大家遇到这样的问题也可以采用上述两种方案中的一种,不过个人推荐使用第一种方案,代码比较清晰可见。采用第二种方案的话,对于后期维护人员可能会不太容易注意到这 “” 和 ‘’ 的差异。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐