【SpringBoot整合Mybatis】数据库字段为空时,接口不返回该字段 解决办法

  • 问题描述:
  • 排查问题:
  • 解决问题:
  • 测试:
  • 参考资料:


       今天整合项目的时候,发现了SpringBoot整合Mybatis的过程中,当数据库中这条记录中的某个字段为空时,select查询,并不返回这个字段,后来终于发现了问题所在,在这里做一个简单的总结,避免下次还出现这样的问题。

问题描述:

我这里的需求是:根据父节点ID来查询其下子节点的全部记录。

出现问题描述如下

1、先看一下数据库里面的记录,拿node_id=30012,parent_node_id=0, parent_node_rule=null,这条记录为例。从数据库中可以看出,目前选择的这条记录中parent_node_id=null,为空。

spring boot 前端空值转null springboot null不返回_字段


输入参数parent_id=0,调用接口来测试,发现返回的结果中并没有partent_node_rule=null的这个字段。即目前的情况是,当数据库中字段为null时,返回中无该字段。

spring boot 前端空值转null springboot null不返回_mybatis_02

排查问题:

1、查看实体类该字段的类型

spring boot 前端空值转null springboot null不返回_数据库_03


从图中可以看出,parentNodeRule字段的类型为Integer,它是int的封装类,默认值为null。目前看来,未存在问题。2、查看controller中接口的调用情况

spring boot 前端空值转null springboot null不返回_mybatis_04


从图中可以看出,调用接口,返回的是dmsZhiKongRules这个对象。返回的是一个对象,那么对象中的字段都应该可以取到的,那下一步排查就去查看xml配置文件中的sql语句。3、查看xml配置文件

spring boot 前端空值转null springboot null不返回_数据库_05


从配置文件中,可以看出,该sql语句已经把parent_node_rule字段查询出来了,这里看也没有问题。

解决问题:

       从目前的排查情况来看,写的代码,暂时是没发现问题,那么就应该考虑其他的原因了,在网上查找了一上午的资料后发现,是配置文件application.yml配置文件的问题。

spring boot 前端空值转null springboot null不返回_mybatis_06

因为项目是团队协作的,所以的配置文件都是共用的,我也只是负责其中的一部分,在进行代码编写的时候很少去操作application.yml配置文件,所以出现问题也很少往这方面想,但是排查了一圈,真的没有发现任何问题,查资料的时候发现可能是配置的问题,于是对这一块简单学习了一下。

从图中可以看出spring下的这个配置被设置成了non_null,也就将Null的情况过滤掉了!这才是一直数据库中字段值为null,不返回该字段的真正原因!

那么将这一点的配置修改为always即可,可参考下面代码对照修改:

spring:
  jackson:
    default-property-inclusion: always
    date-format: "yyyy-MM-dd"
    time-zone: "GMT+8"

测试:

再次调用接口,查看返回的结果

spring boot 前端空值转null springboot null不返回_spring boot_07


已经成功显示字段值为null的这个字段,完美解决!!!!这个问题已经快把我折磨死了,整整查了一上午!!!希望大家可以注意,不要犯这样的错误,早日解决!