将映射属性合并到 Java POJO

Merge map properties to Java POJO

我想为 REST api 实现更新(方法 PUT)操作。在前端应用程序中,我的控制器方法需要值映射,例如:

@PutMapping(value = "/profile")
public UserDto updateProfile(JwtAuthenticationToken jwtAuthenticationToken, @RequestBody Map<String, ?> userForm) {
...
}

我想使用 map 作为请求体而不是 POJO 因为在 opf map 的帮助下我可以为每个状态声明 3 个状态 属性:

  1. 属性 在地图中不存在 - 属性 没有变化,不更新 bean 属性
  2. 属性 存在且不为空 - 用值
  3. 更新 bean 属性
  4. 属性 存在并且为 null - 将 bean 属性 更新为 null

使用 POJO 我无法处理上面列表中的 #1 - 属性 总是以 null 或非 null 值存在

在我的服务方法中,我必须根据上述 3 条规则将地图中的属性与我的 User 对象合并。

当然,我可以在我的自定义代码中使用反射来做到这一点 api 但正在寻找一些可以帮助我完成此任务的现有实用程序...某种

user = BeanUtils.merge(userForm, user);

有的话请告知

您可以将 User 对象转换为 Map 并按如下方式工作:

  • User 转换为 Map 原始对象
  • 将所有项目添加到从 userFormoriginal
  • 将原件转换为 User class
  • 对更新后的用户执行您需要的操作

基本上代码是这样的:

private ObjectMapper objectMapper; 
...

public User merge(User originalUser, Map newUserMap) {
   Map originalUserMap = objectMapper.convertValue(originalUser, Map.class);
   originalUserMap.putAll(newUserMap);
   return objectMapper.convertValue(originalUserMap, User.class);
}

...
User userAfterModifications = merge(user, userForm);
... //  Do what you need with the updated user

请注意,您需要确保 Map 实现支持空值。