我注意到许多提供的答案都是关于JSON补丁或不完整的答案。以下是一个完整的解释和示例,展示了您需要的功能和真实可用的代码。
一个完整的补丁函数:
@ApiOperation(value = "Patch an existing claim with partial update")
@RequestMapping(value = CLAIMS_V1 + "/{claimId}", method = RequestMethod.PATCH)
ResponseEntity<Claim> patchClaim(@PathVariable Long claimId, @RequestBody Map<String, Object> fields) {
if (claimId <= 0 || fields == null || fields.isEmpty() || !fields.get("claimId").equals(claimId)){
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
Claim claim = claimService.get(claimId);
if( claim == null){
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
fields.remove("claimId");
fields.forEach((k, v) -> {
Field field = ReflectionUtils.findField(Claim.class, k);
field.setAccessible(true);
ReflectionUtils.setField(field, claim, v);
});
claimService.saveOrUpdate(claim);
return new ResponseEntity<>(claim, HttpStatus.OK);
}
对于一些新开发者来说,上述内容可能会令人困惑,因为他们通常不会像那样处理反射。基本上,无论您在请求体中传递什么,它都将使用给定的ID查找关联索赔,然后仅更新您作为键值对传递的字段。
请求体示例:
PATCH /claims/7
{
"claimId":7,
"claimTypeId": 1,
"claimStatus": null
}
以上操作将会更新索赔号为7的索赔类型和索赔状态,而不会影响其他值。
因此返回的结果可能类似于:
{
"claimId": 7,
"claimSrcAcctId": 12345678,
"claimTypeId": 1,
"claimDescription": "The vehicle is damaged beyond repair",
"claimDateSubmitted": "2019-01-11 17:43:43",
"claimStatus": null,
"claimDateUpdated": "2019-04-09 13:43:07",
"claimAcctAddress": "123 Sesame St, Charlotte, NC 28282",
"claimContactName": "Steve Smith",
"claimContactPhone": "777-555-1111",
"claimContactEmail": "steve.smith@domain.com",
"claimWitness": true,
"claimWitnessFirstName": "Stan",
"claimWitnessLastName": "Smith",
"claimWitnessPhone": "777-777-7777",
"claimDate": "2019-01-11 17:43:43",
"claimDateEnd": "2019-01-11 12:43:43",
"claimInvestigation": null,
"scoring": null
}
正如你所看到的,完整的对象将返回而不更改除你想要更改的数据以外的任何数据。我知道这里解释有些重复,我只是想清晰地概述一下。
PATCH
的方法。并且在GitHub上提供了一个可工作的示例。 - cassiomolin