Объединить значения полезной нагрузки json в Object - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу объединить полезную нагрузку REST PATH с объектом 'Entity' после получения ее из базы данных, чтобы в сущности обновлялись только атрибуты, предоставленные в полезной нагрузке. Следовательно, я хочу гарантировать, что только атрибуты, предоставленные как часть полезной нагрузки исправления, будут обновлены безопасно.

Я использую Spring Rest Controller с объектами Hibernate.

@PatchMapping(value = "/{id}")
public Resource<DepartmentPEO> update(@PathVariable Long id,
        @RequestBody JSONObject payload) throws Exception
{
    DepartmentPEO eo = departmentService.getRow(id);
    // Have to do something to update the eo object from jsonObject.
    // Some api to update eo
    eo = departmentService.update(id, eo);

    Resource<DepartmentPEO> resource = new Resource<>(eo);
    DepartmentPEO dept = resource.getContent();
    id = dept.getDeptSeq();
    resource.add(
            linkTo(methodOn(DepartmentsRestController.class).getRow(id))
                    .withSelfRel());
    return resource;
}

Только измененные атрибуты будут отправлены как часть полезной нагрузки на сервер вместо отправки всех атрибутов. Ресурс (сущность) будет иметь вложенный список объектов (один-ко-многим). Я ищу решение для защиты пула для этого варианта использования, а также считаю, что оно является общим / базовым для всех остальных поддерживаемых API-приложений.

Указав на любое API для решения этой проблемы, мы будем очень признательны!

Спасибо

1 Ответ

0 голосов
/ 06 ноября 2018

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

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Test;
import org.springframework.beans.BeanUtils;

public class StackOverflow {

 @Test
 public void mergeTest() throws IOException, JSONException {
    DepartmentPEO existingDepartement = existingDepartmentPEO();

    JSONObject payload = new JSONObject();
    payload.put("name", "newName");
    DepartmentPEO result = mergeToObject(payload, existingDepartement);
    assert result.getName().equals("newName");
    assert result.getId().equals("1");
 }

 private DepartmentPEO existingDepartmentPEO() {
    DepartmentPEO existingDepartement = new DepartmentPEO();
    existingDepartement.setId("1");
    existingDepartement.setName("oldName");
    return existingDepartement;
 }

 private DepartmentPEO mergeToObject(JSONObject payload, DepartmentPEO object) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    DepartmentPEO updateRequest = objectMapper.readValue(payload.toString(), DepartmentPEO.class);
    BeanUtils.copyProperties(updateRequest, object, "id");
    return object;
 }
}

Здесь я преобразую JSONObject в класс DepartmentPEO, затем копирую этот объект в существующий, игнорируя идентификатор поля.

Возможно, вы захотите иметь общий способ игнорирования пустых полей из JSONObject, тогда вы можете обратиться к этому сообщению, например, Как игнорировать нулевые значения с помощью springframework BeanUtils copyProperties?

Я бы посоветовал отправлять непосредственно объект DepartmentPEO в сигнатуру метода REST вместо использования JSONObject.

Привет

...