【问题标题】:Merge map properties to Java POJO将地图属性合并到 Java POJO
【发布时间】:2021-08-31 07:39:43
【问题描述】:

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

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

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

  1. 地图中没有属性 - 属性未更改,请勿更新 bean 属性
  2. 属性存在且不为空 - 使用值更新 bean 属性
  3. 属性存在且为 null - 使用 null 更新 bean 属性

使用 POJO,我无法处理上面列表中的 #1 - 该属性始终存在 null 或非 null 值

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

当然,我可以在我的自定义代码中使用反射 api 执行此操作,但要寻找一些可以帮助我完成此任务的现有实用程序......某种

user = BeanUtils.merge(userForm, user);

如果有请告知。

【问题讨论】:

    标签: java spring-boot rest merge apache-commons-beanutils


    【解决方案1】:

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

    • User 转换为Map 原始对象
    • 将所有项目添加到从userFormoriginal
    • 将原始转换为User
    • 对更新后的用户做你需要的事情

    基本上代码是这样的:

    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 实现支持空值。

    【讨论】:

    • 谢谢!这正是我需要的!
    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多