我有休闲代码:
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(),我想对函数使用引用,但是我不知道如何实现。可以那样做吗?也许有更好的方法可以做到这一点?
答案 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。