java 返回前端的字段莫名为空 引用对象的坑
2023-03-07 本文已影响0人
饱饱抓住了灵感
发生条件
当以下3个条件同时满足时, 问题就会发生:
- 返回前端的VO对象包含着另一引用对象;
- 在返回前对引用对象的字段进行了赋值;
- 有多个展示对象关联着相同的引用对象;
结果
最后一次的赋值会覆盖掉前面所有的赋值
- 如果最后一次恰好是空, 那前面的也会都被设为空;
- 如果最后一次不是空值, 那么问题会更加难以发现.
解决
使用新对象接收引用对象的值(即字段拷贝), 在新对象上字段上赋值, 然后VO对象关联新对象
代码示例
错误代码:
// 用户数据
List<User> users = getUsers();
// 车牌号映射车辆对象
Map<String, Car> mapNoToCar = getMapNoToCar();
for(User usr: users){
Car car = mapNoToCar.get(usr.getCarNo());
car.setName(usr.getName()+usr.getAge());
usr.setCar(car);
}
return users;
如上代码, 前端展示user.car.name会出错
以下为修正后的代码, user.car.name可正常展示:
// 用户数据
List<User> users = getUsers();
// 车牌号映射车辆对象
Map<String, Car> mapNoToCar = getMapNoToCar();
for(User usr: users){
Car car = mapNoToCar.get(usr.getCarNo());
// 新建对象接收引用对象值
Car copyCar = new Car();
BeanUtils.copyPrperties(car, copyCar);
copyCar.setName(usr.getName()+usr.getAge());
usr.setCar(copyCar);
}
return users;