处理两个对象(实体)之间的字段

时间:2018-09-28 15:47:12

标签: java spring hibernate entity

我有休闲代码:

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());

我有一个想法,要创建一个使此更改更简单的函数,因此我使用方法updateField()创建了内部类FieldCopier。我想做这样的事情:

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

相反:

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

但是我不知道如何实现方法updateField(),我想对函数使用引用,但是我不知道如何实现。可以那样做吗?也许有更好的方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以做的是:

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()调用的第二个参数。

答案 1 :(得分:1)

您可以使用杰克逊的更新程序功能。

//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);

输入内容包含映射到Osaba对象的json。