探案:其它配置|参数无错,罪魁祸首是它----使用lombok包Builder注解引起MyBatisSystemException
案件回顾:
场景:实现某查询功能。
详情具体如下:
注意⚠️⚠️
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'xxx' from result set. Cause: java.lang.NumberFormatException: For input string: "xxx"
报错代码:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'account_id' from result set. Cause: java.lang.NumberFormatException: For input string: "0a059b05-d63c-4782-b981-836ea9e6beb9"
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
at com.sun.proxy.$Proxy86.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:145)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
at com.sun.proxy.$Proxy135.blockchainTradeTransactionList(Unknown Source)
........
@Builder主要是利用建造者模式来构建对象,设置参数值时能够更加直接明了
import lombok.Builder;
@Builder
@Schema(description = "区块链交易流水")
public class BlockchainTradeTransactionDO {
@Schema(description = "A UUID")
private String id;
private Integer clientId;
........
}
案情分析:
排查:
1、首先确认数据库中列和Java实体参数数据类型是否一致
2、检查mybatis映射文件,确保resuleMap或实体类中,数据库字段是否正确映射Java类型
3、日志调试,开启日志调试,可更详细查看执行的SQL语句与参数。
以上排查,并未发现问题。
小小的脑袋发出大大的问好❓❓❓
又冷静下来,想想~~
排查注解使用@Builder,它会默认帮我们实现Getter和Setter等方法,通过骚操作反编译MemberPointChange等类,我发现使用@Builder注解,Lombok只会生成有参构造器,而不会生成无参构造器,并且遇到十六进制字符串格式转换时,易出现异常。
所以果断舍弃@Builder,手动创建新对象。
解决方案:
不使用@Builder注解
有些问题往往出现在我们意想不到的惯性思维当中,认为它没问题,结果它又问题。
本文来自博客园,作者:手可敲星辰脚驾七彩云,转载请注明原文链接:https://www.cnblogs.com/arek/p/18283318,谢谢!