问题背景
今天在开发过程中,项目请求报了一个错,错误信息【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" ,强转数值类型失败
<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' 通过 .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'" 的 "" 变 '' ,而内部常量值的 '' 变成 "",处理后就是这样了
<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>
这种方案也是可行的,亲测有效,大家遇到这样的问题也可以采用上述两种方案中的一种,不过个人推荐使用第一种方案,代码比较清晰可见。采用第二种方案的话,对于后期维护人员可能会不太容易注意到这 "" 和 '' 的差异。