Есть ли более эффективный способ обработки обновлений запроса на исправление, кроме выполнения нулевых проверок при весенней загрузке? - PullRequest
1 голос
/ 05 апреля 2020

Есть ли лучший подход к обновлению, кроме первоначального выполнения нулевых проверок?

@PatchMapping("/base/uri/{id}")
public void updateModel(@Valid @RequestBody Model newModel, @Pathvariable Long id) {
    modelRepository.findById(id).map(model -> {
        if (newModel.getParam1() != null) model.setParam1(newModel.getParam1());
        if (newModel.getParam2() != null) model.setParam1(newModel.getParam2());
        if (newModel.getParam3() != null) model.setParam1(newModel.getParam3());
        if (newModel.getParam4() != null) model.setParam1(newModel.getParam4());
        ...
        modelRespository.save(model);
    }).orElseThrow(() -> MyNotFoundException());
}

1 Ответ

2 голосов
/ 05 апреля 2020

Вы можете использовать BeanUtils каркаса пружины, добавляя свойства для игнорирования (которые в данном случае являются нулевыми), например:

import java.beans.FeatureDescriptor;
import java.util.stream.Stream;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

@PatchMapping("/base/uri/{id}")
public void updateModel(@Valid @RequestBody Model newModel, @Pathvariable Long id) {
modelRepository.findById(id).map(model -> {
       String[] nulls = getNullPropertyNames(newModel);
       // copy the newModel into model 
       // avoiding the properties listed in "nulls"
       BeanUtils.copyProperties(newModel, model, nulls);
       modelRespository.save(model);
   }).orElseThrow(() -> MyNotFoundException());
}

public static String[] getNullPropertyNames(Object source) {
    final BeanWrapper wrappedSource = new BeanWrapperImpl(source);
    return Stream.of(wrappedSource.getPropertyDescriptors())
        .map(FeatureDescriptor::getName)
        .filter(propertyName -> wrappedSource.getPropertyValue(propertyName) == null)
        .toArray(String[]::new);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...