Копирование полей между двумя объектами (сущностями) - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть следующий код:

public Osoba updateOsoba(String input) throws Exception {

    class FieldCopier {          // in progress....
        void updateField() {
        }
    }

    Osoba in = null;
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    in = mapper.readValue(input, Osoba.class);

    final int osobaId = Optional
            .ofNullable(in.getOsobaId())
            .orElseThrow(() -> new Exception("....."));

    Osoba os = osobaDao.findOne(osobaId);
    if (in.getOsobaImiona() != null) os.setOsobaImiona(in.getOsobaImiona());            
    if (in.getOsobaNazwisko() != null) os.setOsobaNazwisko(in.getOsobaNazwisko());
    //....

    return in;
}

Эта конструкция, на мой взгляд, подвержена ошибкам:

if (in.getOsobaImiona() != null) os.setOsobaImiona(in.getOsobaImiona());

У меня есть идея создать функцию, которая сделает это изменение более простым, поэтому я создал внутренний класс FieldCopier с помощью метода updateField ().Я хочу сделать что-то вроде этого:

FieldCopier fc = new FieldCopier();
fc.updateField(in::getOsobaImiona, os::setOsobaImiona)

вместо:

if (in.getOsobaImiona() != null) os.setOsobaImiona(in.getOsobaImiona()); 

Но я понятия не имею, как реализовать метод updateField (), я хочу использовать ссылку на функцию, но яне знаю какМожно ли сделать это таким образом?Или, может быть, есть лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Вы можете использовать функцию обновления от Джексона.

//set this to not update a non null value with null
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

//find your source object for updating 
Osoba source = osobaDao.findOne(osobaId);

// update fields based on input json
source = objectMapper.readerForUpdating(source)
            .readValue(input);

Где вход содержит json, сопоставленный с объектом Osaba.

0 голосов
/ 28 сентября 2018

Возможные вещи, которые вы можете сделать:

public void updateField (Object objectToUpdate, String functionName, Object newValue) {
    try {
        Method method = objectToUpdate.getClass().getMethod(functionName, String.class);
        method.invoke(objectToUpdate, newValue);
    }catch (Exception e){
        e.printStackTrace();
    }
}

и вызвать его следующим образом:

updateField(os, "setOsobaImiona", in.getOsobaImiona());

method.invoke() вызовет функцию os.setOsobaImiona(in.getOsobaImiona()).Я рассматриваю параметр как строку, в противном случае вы должны изменить второй параметр getMethod() call.

...