找回密码
 立即注册
首页 业界区 业界 XML中俩个String类型的比较却抛出NumberFormatException ...

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

施婉秀 昨天 21:05

  • 问题描述:查询postedFlag为'Y'/'N'的值,DTO中定义的postedFlag类型为String,执行SQL时报错:
原始代码:
  1. <if test="postedFlag != null and postedFlag != ''">
  2.    
  3.     <if test="postedFlag.toUpperCase() == 'Y'">
  4.         and cit.POSTED_FLAG = #{postedFlag}
  5.     </if>
  6.    
  7.     <if test="postedFlag.toUpperCase() == 'N'">
  8.         and (cit.POSTED_FLAG = #{postedFlag} or cit.POSTED_FLAG IS NULL)
  9.     </if>
  10. </if>
复制代码
报错信息:
  1. {
  2. "code": "500",
  3. "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"",
  4. "data": null
  5. }
复制代码
错误原因:


  • 使用'Y'是由单引号包裹的单字符,直接被转换为Char类型,使用'ABC'是由单引号包裹的多字符,会按照String类型处理
  • 'Y'为Char类型,而左边传入的postedFlag是String类型,所以会有类型转换的异常
  • 虽然是Char转换String的错误,但是OGNL在比较俩个不同类型的值时,不会直接做【类型转换】,而是优先做【数值转换】,即在处理 char 与 String 比较时,走了【先转数字再比较】的中间链路,先将俩边的值都转为数字,再比较数字大小,因此会抛出NumberFormatException的异常
修改后正确的代码:
  1.    <if test="postedFlag != null and postedFlag != ''">
  2.       
  3.         <if test="postedFlag.toUpperCase() == 'Y'.toString()">
  4.             and cit.POSTED_FLAG = #{postedFlag, jdbcType=VARCHAR}
  5.         </if>
  6.         
  7.         <if test="postedFlag.toUpperCase() == 'N'.toString()">
  8.             and (cit.POSTED_FLAG = #{postedFlag} or cit.POSTED_FLAG IS NULL)
  9.         </if>
  10.     </if>
复制代码
为什么不将'Y'修改为"Y"进行比较,而要使用'Y.toString()'的形式来解决?

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册