Установите значение по умолчанию для поля при заполнении POJO с помощью Bean Utils

Я пытаюсь заполнить поля POJO, используя метод BeanUtilsBean.populate(object, fieldNameVSfieldValueMap).

Мой POJO выглядит так:

class POJO{
  Integer intField;
  Double doubleField
  String str;
}

В настоящее время у меня есть HashMap, который содержит карту между именем поля и значением поля.

Теперь со следующим кодом:

POJO obj = new POJO();
Map<String,String> map = new HashMap<>();
map.put("intField", "1");
map.put("doubleField", "1.1");
BeanUtilsBean.populate(obj, map)

С приведенным выше кодом в моем объекте POJO obj поля intField и doubleField заполняются значениями 1 и 1.1 соответственно, что, как и ожидалось.

Проблема заключается в том, что строковому полю str присваивается значение null, так как в хэш-карте для str не было записи, а null является значением по умолчанию для String. Но я хочу, чтобы был явный способ установить мое пользовательское значение в поле, когда они не упоминаются на карте. В этом примере допустим, что я хочу установить для str значение «john», так как на карте нет записи для str. Редактировать 1: А также это должно быть специфично для типа поля. Итак, если в POJO есть другие поля, и они имеют тип String, то для всех тех полей String, для которых нет записи на карте, следует заполнить John.

Редактировать 2: POJO определен в другом проекте, к которому у меня нет доступа для фиксации, поэтому установка значений по умолчанию в самом POJO не является для меня решением.

ну... тогда просто установите для этой строки значение по умолчанию, String str = "john";, иначе оно будет заменено значением, переданным в HashMap

Leviand 28.05.2019 08:57

Pojo определен в другом проекте, к которому у меня нет доступа для фиксации, поэтому я не могу установить значения по умолчанию таким образом. А также у меня есть несколько полей

DockYard 28.05.2019 08:58

хорошо, добавьте эту информацию к своему вопросу, потому что это очень важно :)

Leviand 28.05.2019 08:59

отлично добавлено :) Я как-то думал, что это можно сделать через org.apache.commons.beanutils.ConvertUtilsBean, но не смог найти полезную вещь в их документации

DockYard 28.05.2019 09:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
2 000
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В основном вы можете сделать:

Map<String, String> map = new HashMap<>() {  // new HashMap<String, String> perhaps
    @Override
    public String get(Object key} {
        return super.getOrDefault(key, "john");
    }
}

Если вам нужны разные значения по умолчанию для каждого поля, используйте локальную карту, предварительно заполненную значениями по умолчанию.

Затем вы должны создать свой собственный класс.

Насколько я понимаю, это попытается установить значение «Джон» для всех полей, которые есть в POJO, но отсутствуют на карте. Вместо этого мне нужно, чтобы это было сделано только для строковых полей

DockYard 28.05.2019 09:22

@DockYard, тогда вам нужно различать поля, например, используя локальную карту имен строковых полей, возможно, определяемую один раз для каждого отражения.

Joop Eggen 28.05.2019 09:27
Ответ принят как подходящий

Попробуйте использовать класс org.apache.commons.beanutils.BeanUtilsBean с помощью класса org.apache.commons.beanutils.ConvertUtilsBean.

Другие вопросы по теме