Объединить свойства карты в Java POJO

#java #spring-boot #rest #merge #apache-commons-beanutils

Вопрос:

Я хотел бы реализовать операцию ОБНОВЛЕНИЯ (метод PUT) для REST api. Из интерфейсного приложения мой метод контроллера ожидает карту значений, например:

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

Я хотел бы использовать map в качестве тела запроса, а не POJO, потому что с помощью opf map я могу объявить 3 состояния для каждого свойства:

  1. свойство отсутствует на карте — свойство не изменяется, не обновляйте свойство компонента
  2. свойство присутствует и не является нулевым — обновите свойство компонента со значением
  3. свойство присутствует и является нулевым — обновите свойство компонента с нулем

с POJO я не могу обработать #1 из приведенного выше списка — свойство всегда присутствует с нулевым или ненулевым значением

В моем методе обслуживания я должен объединить свойства с карты с моим User объектом на основе 3 правил выше.

Конечно, я могу сделать это в своем пользовательском коде с API отражения, но ищу какой-то существующий интерфейс, который может помочь мне в этой задаче… какой-то

 user = BeanUtils.merge(userForm, user);
 

Пожалуйста, сообщите, если таковые имеются.

Ответ №1:

Вы можете преобразовать свой User объект в a Map и работать следующим образом:

  • преобразование User в Map исходный объект
  • добавить все элементы в из userForm в original
  • преобразуйте оригинал в 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
 

Обратите внимание, что вы должны быть уверены, что реализация карты поддерживает нулевые значения.

Комментарии:

1. Спасибо! Это именно то, что мне нужно !