【问题标题】:Coping fields between two objects (entities)处理两个对象(实体)之间的字段
【发布时间】:2018-09-28 15:47:12
【问题描述】:

我有闲置代码:

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(),我想使用对函数的引用但我不知道如何。有可能这样做吗?或者也许有更好的方法来做到这一点?

【问题讨论】:

标签: java spring hibernate entity


【解决方案1】:

您可以使用 jackson 的更新程序功能。

//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。

【讨论】:

    【解决方案2】:

    你可以做的可能是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多