Java日志打印时guidPrefix返回为null的问题排查与修正
问题根因
- 当前流程中
Input实例的guidPrefix字段没有走完完整赋值链路,最终保持Java对象默认的null值,才会出现日志打印为null的问题,核心断点有两处:- 自定义的
InputRowMapper在将数据库查询结果集映射为Input对象时,没有对guidPrefix字段做取值赋值。如果查询SQL本身没有返回guid_prefix对应的列,Mapper自然没有可映射的数据源。 - 方法入参传入的
prefix值,仅做了合法性校验、作为SQL查询参数传入数据库,没有在查询拿到Input实例后,将这个值经过处理赋值给实例的guidPrefix字段。
- 自定义的
- 现有
setGuidPrefix的截取逻辑没有做空值/长度兜底,如果直接把null或长度为1的字符串传入,会直接触发空指针或下标越界异常,是赋值链路里的潜在风险点。
具体修改方案
- 第一,先校验
SQL_FIND查询语句,确认返回字段中包含guid_prefix对应的数据库列,从数据源层面保证字段值可以被查询到。 - 第二,补全
InputRowMapper的映射逻辑:在结果集转Input对象的方法中,显式调用input.setGuidPrefix(resultSet.getString("guid_prefix"))完成字段映射,注意取值用的列名/别名要和SQL返回的字段名完全对齐。 - 第三,给
setGuidPrefix方法增加安全兜底逻辑,替换原来无防护的直接截取实现:public void setGuidPrefix(String guidPrefix) { if (StringUtils.isNotBlank(guidPrefix) && guidPrefix.length() > 1) { this.guidPrefix = StringUtils.substring(guidPrefix, 0, guidPrefix.length() - 1); } else { this.guidPrefix = guidPrefix; } } - 第四,如果业务定义的
guidPrefix来源是方法入参prefix而非数据库字段,需要在jdbcTemplate.queryForObject拿到返回的input实例后、执行日志打印语句前,显式调用input.setGuidPrefix(prefix)完成赋值,不要依赖框架的自动装配逻辑。 - 验证环节:在日志语句执行前增加断点,确认
input.getGuidPrefix()已被正确赋值后再执行日志输出,避免空值漏出。
内容的提问来源于stack exchange,提问作者ssv1797
相关产品推荐
相关产品推荐

