今天整合项目的时候,发现了SpringBoot整合Mybatis的过程中,当数据库中这条记录中的某个字段为空时,select查询,并不返回这个字段,后来终于发现了问题所在,在这里做一个简单的总结,避免下次还出现这样的问题。
我这里的需求是:根据父节点ID来查询其下子节点的全部记录。
出现问题描述如下:
1、先看一下数据库里面的记录,拿node_id=30012,parent_node_id=0, parent_node_rule=null,
这条记录为例。从数据库中可以看出,目前选择的这条记录中parent_node_id=null,为空。
输入参数parent_id=0,调用接口来测试,发现返回的结果中并没有partent_node_rule=null的这个字段。即目前的情况是,当数据库中字段为null时,返回中无该字段。
1、查看实体类该字段的类型
从图中可以看出,parentNodeRule字段的类型为Integer,它是int的封装类,默认值为null。目前看来,未存在问题。
2、查看controller中接口的调用情况
从图中可以看出,调用接口,返回的是dmsZhiKongRules这个对象。返回的是一个对象,那么对象中的字段都应该可以取到的,那下一步排查就去查看xml配置文件中的sql语句。
3、查看xml配置文件
从配置文件中,可以看出,该sql语句已经把parent_node_rule字段查询出来了,这里看也没有问题。
从目前的排查情况来看,写的代码,暂时是没发现问题,那么就应该考虑其他的原因了,在网上查找了一上午的资料后发现,是配置文件application.yml
配置文件的问题。
因为项目是团队协作的,所以的配置文件都是共用的,我也只是负责其中的一部分,在进行代码编写的时候很少去操作application.yml配置文件,所以出现问题也很少往这方面想,但是排查了一圈,真的没有发现任何问题,查资料的时候发现可能是配置的问题,于是对这一块简单学习了一下。
从图中可以看出spring下的这个配置被设置成了non_null,也就将Null的情况过滤掉了!这才是一直数据库中字段值为null,不返回该字段的真正原因!
那么将这一点的配置修改为always即可,可参考下面代码对照修改:
spring:
jackson:
default-property-inclusion: always
date-format: "yyyy-MM-dd"
time-zone: "GMT+8"
再次调用接口,查看返回的结果
已经成功显示字段值为null的这个字段,完美解决!!!!这个问题已经快把我折磨死了,整整查了一上午!!!希望大家可以注意,不要犯这样的错误,早日解决!