1. 问题背景与现象描述
最近在开发一个电商后台管理系统时,遇到了一个看似简单却困扰团队半天的数据传递问题。前端页面在渲染商品列表时,所有商品的"status"状态字段始终显示为null,而数据库明明存储了正确的状态值(1表示上架,0表示下架)。这个bug直接导致页面的上下架标签全部失效,严重影响了运营同学的工作效率。
通过Chrome开发者工具查看接口返回数据,发现JSON中的status字段确实是null。但奇怪的是,后端调试时实体类对象中的status字段值是正确的。这种"后端有值,前端收不到"的情况,在Spring Boot + MyBatis的技术栈中其实很常见,但每次具体原因可能各不相同。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题排查过程全记录
2.1 初步排查方向
首先按照常规思路进行了分层检查:
- 数据库层验证:直接查询数据库确认status字段有值且不为NULL
- MyBatis映射检查:确认XML中resultMap正确映射了status字段
- 实体类检查:确认Goods实体类中有status字段及对应的getter/setter
- Controller层调试:断点确认返回给前端的DTO对象中status为null
2.2 关键发现点
在深入调试后发现一个容易被忽视的细节:实体类Goods中status字段是Byte类型,而返回给前端的GoodsDTO中status是Integer类型。虽然这两个类型在数值上可以兼容,但在对象转换时却出现了问题。
java复制// 实体类定义
public class Goods {
private Byte status; // 数据库tinyint映射为Byte
// 其他字段...
}
// DTO类定义
public class GoodsDTO {
private Integer status; // 前端期望用Integer
// 其他字段...
}
2.3 根本原因分析
问题出在对象转换环节。当使用BeanUtils.copyProperties()进行属性拷贝时,Byte到Integer的自动转换没有生效。这是因为:
- BeanUtils默认只处理相同类型的属性拷贝
2
