Spring Boot项目返回DTO时id与itemName字段为null如何解决?
问题原因
- 业务逻辑方向错误:你需要返回Item列表对应所属用户信息,但你在
getAllItems方法中查询的是用户表userRepository.findAll(),全程没有用到注入的itemRepository,根本没有从数据库查询任何Item数据。 - DTO转换逻辑完全错误:
- 你在
itemsOwnedByUserDto方法中自行new了空的Item对象,该对象没有从数据库取值,id和name字段自然为null ModelMapper用法错误:modelMapper.map方法第一个参数需要传入待转换的源对象实例,你传入的是Item.class类对象,无法得到有效映射结果
- 你在
- 字段名不匹配:你期望返回的JSON字段为
name、ownerUsername,但你的DTO当前字段为itemName、ownerName,序列化后字段名和预期不符。 - Item实体类缺少必要注解:你贴出的Item代码开头没有标注
@Entity和@Table,会导致JPA无法正确映射数据库表。
修复步骤
1. 补全Item实体类注解
@Entity @Table(name = "items") public class Item { // 原有Item代码保持不变即可 }
提示:如果查询Item时出现关联User为空的问题,可以在
user字段上修改注解为@ManyToOne(fetch = FetchType.EAGER),开启立即加载关联的用户数据。
2. 修正Service层逻辑
@Service public class ItemServiceImp { @Autowired private ItemRepository itemRepository; @Autowired private ModelMapper modelMapper; public List<ItemsOwnedByUserDto> getAllItems() { // 查询所有Item数据而非用户数据 return itemRepository.findAll() .stream() .map(this::convertItemToDto) .collect(Collectors.toList()); } private ItemsOwnedByUserDto convertItemToDto(Item item) { ItemsOwnedByUserDto dto = new ItemsOwnedByUserDto(); // 从数据库查询到的item对象取值 dto.setId(item.getId()); dto.setName(item.getName()); dto.setOwnerId(item.getUser().getId()); dto.setOwnerUsername(item.getUser().getUserName()); return dto; } }
3. 对齐DTO字段名
修改你的ItemsOwnedByUserDto类的字段,和预期输出对齐:
public class ItemsOwnedByUserDto { private Long id; // 将原来的private String itemName; 修改为 private String name; private Long ownerId; // 将原来的private String ownerName; 修改为 private String ownerUsername; // 对应get、set方法同步修改即可 }
如果你不想修改DTO字段名,也可以在字段上加@JsonProperty注解指定序列化后的名称:
@JsonProperty("name") private String itemName; @JsonProperty("ownerUsername") private String ownerName;
修复完成后即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者georgik1_
相关产品推荐
相关产品推荐

