XML中俩个String类型的比较却抛出NumberFormatException异常

  1. 问题描述:查询postedFlag为'Y'/'N'的值,DTO中定义的postedFlag类型为String,执行SQL时报错:

原始代码:

java 复制代码
<if test="postedFlag != null and postedFlag != ''">
    <!-- 传入Y:只查postedFlag=Y -->
    <if test="postedFlag.toUpperCase() == 'Y'">
        and cit.POSTED_FLAG = #{postedFlag}
    </if>
    <!-- 传入N:查postedFlag=N 或 空 -->
    <if test="postedFlag.toUpperCase() == 'N'">
        and (cit.POSTED_FLAG = #{postedFlag} or cit.POSTED_FLAG IS NULL)
    </if>
</if>

报错信息:

java 复制代码
{
"code": "500",
"message": "接口 [/v1/inventory-transactions/query]内部错误,请联系管理员,错误信息:\r\n### Error querying database.  Cause: java.lang.NumberFormatException: For input string: \"N\"\r\n### Cause: java.lang.NumberFormatException: For input string: \"N\"",
"data": null
}

错误原因:

  • 使用'Y'是由单引号包裹的单字符,直接被转换为Char类型,使用'ABC'是由单引号包裹的多字符,会按照String类型处理
  • 'Y'Char类型,而左边传入的postedFlagString类型,所以会有类型转换的异常
  • 虽然是Char转换String的错误,但是OGNL在比较俩个不同类型的值时,不会直接做【类型转换】,而是优先做【数值转换】,即在处理 char 与 String 比较时,走了【先转数字再比较】的中间链路,先将俩边的值都转为数字,再比较数字大小,因此会抛出NumberFormatException的异常

修改后正确的代码:

java 复制代码
   <if test="postedFlag != null and postedFlag != ''">
       <!-- 传入Y:只查postedFlag=Y -->
        <if test="postedFlag.toUpperCase() == 'Y'.toString()">
            and cit.POSTED_FLAG = #{postedFlag, jdbcType=VARCHAR}
        </if>
        <!-- 传入N:查postedFlag=N 或 空 -->
        <if test="postedFlag.toUpperCase() == 'N'.toString()">
            and (cit.POSTED_FLAG = #{postedFlag} or cit.POSTED_FLAG IS NULL)
        </if>
    </if>

为什么不将'Y'修改为"Y"进行比较,而要使用'Y.toString()'的形式来解决?

  • 修改为:<if test="postedFlag.toUpperCase() == "Y" ">

XML文件会报错:XML 双引号冲突(语法级报错)

相关推荐
丿末兮1 年前
Flutter 学习之旅
学习·flutter·bug解决
路宇2 年前
Android studio配置Flutter开发环境报错问题解决
android·flutter·jdk·android studio·bug解决