EasyExcel使用记录,与读取xlsx中数据写入到数据库失败问题的断点调试心得
EasyExcel使用心得,与读取xlsx中数据写入到数据库失败问题记录(断点调试)
首先记录一下对Excel工具的使用心得
业务需要使用读excel文件来进行数据库写入操作,这里使用了EasyExcel工具进行操作
EasyExcel工具可以用java对excel文件进行读写。
导入相关依赖,然后创建和Excel文件对应的实体类,使用注解标记对应列关系。
在Controller中建立上传文件接口,接口参数使用MultipartFile,这样便可以使用Swagger进行测试文件上传。然后在Controller中调用service中定制的业务方法。
InputStream inputStream = file.getInputStream();
// 第一个参数是从controller过来的文件流,第二个参数是与excel对应的实体类,第三个参数为创建的监听器
EasyExcel.read(inputStream, ExcelEntity.class, new SubjectExcelListener(subjectService)).sheet().doRead();
读操作需要创建监听器,监听器类继承AnalysisEventListener
EasyExcel会对Excel文件进行一行一行的读取,每次读取的数据都放到对应的实体类中。我们可以在进行读操作时候的监听器中对读数据需求进行进一步定制。
其中invoke方法会一行一行读取excel数据并将其放进excel对应实体类中,可以使用get方法对其进行获取,然后使用mp语句将其添加到与数据库表中对应的实体类字段中。
doAfterAllAnalysed方法会在读取完毕之后运行。暂时没有用到。
上传excel文件出现错误
使用Swagger测试上传文件,发现出现id字段类型不匹配的报错。
我当时的解决问题思路是:
1.查看excel使用流程,看看是否某个固定流程出现了错误。查看之后没有发现错误。
2.打断点调试检查,发现方法执行到save之前一直没有问题,而且save之前上一句,显示id值已经自动生成,其他值均有,没有null存在。于是进一步收束问题空间,开始怀疑是否为mp设置出现了问题,导致id类型不匹配。
- 我傻了,发现实体类中
@ApiModelProperty(value = "课程类别ID")
@TableId(value = "id", type = IdType.ID_WORKER)
private String id;
此处TableId注解的type值应该为ID_WORKER_STR,按理来讲代码生成器所生成的代码应该直接与表属于逆向工程关系 ,没有问题,但是我当时好像纠结了一下id的int和string的问题,改回string后type = IdType.ID_WORKER没有改为对应的ID_WORKER_STR。导致了插入id时候值与类型不匹配的问题。
总结心得
遇见bug的主要思路是收束问题空间。并且要根据报错信息指向问题大概模块。
此次我耗费较长时间来排查这个小问题,主要的原因在于没有没有特别重视报错的指示范围,反而自己先思考是不是使用插件的流程出现了问题。这是不应该的。
应该首先根据报错信息收束问题范围,然后联想什么样的模块与此次报错有关。
实在不行可以写几个测试用例进行针对性的排查,或者打断点调试,观察数据的流向,看看是不是哪块的数据流没有照顾好。
希望能记住此次经验,以后debug速度能快一些。
本文作者:逐东
本文链接:https://www.cnblogs.com/vuds/p/16021346.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步