我想在从数据库中获取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来解决此问题!
谢谢
答案 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。
致谢