合并JSON负载值到对象

时间:2018-11-06 10:42:25

标签: java json hibernate rest spring-rest

我想在从数据库中获取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;
}

仅将修改后的属性作为有效负载的一部分发送到服务器,而不是发送所有属性。资源(实体)将具有嵌套的对象列表(一对多)。我正在寻找这种用例的防池解决方案,并且还认为这对于每个受REST API支持的应用都是普遍/基本的。

非常感谢指向任何API来解决此问题!

谢谢

1 个答案:

答案 0 :(得分:0)

这是一个使用Spring的Jackson的ObjectMapper和BeanUtils的有效示例(因为我假设您使用的是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类,然后忽略该字段ID将其复制到现有对象中。

您可能希望有一种通用的方法来忽略JSONObject中的空字段,然后您可以参考此帖子,例如How to ignore null values using springframework BeanUtils copyProperties?

我建议直接将DepartmentPEO对象发送到REST方法签名中,而不要使用JSONObject。

致谢