我正在制作一個 Spring Boot 應用程式。我在那里有一個物體:
@Entity
public class Employee {
@NotNull
private Category category;
// Education related fields
@NotNull
private Education education;
@NotBlank
private String eduName;
@NotNull
private LocalDate eduGraduationDate;
// other fields, getters, setters ...
}
如您所見,我在那里有驗證注釋。但是在我的應用程式中,我需要部分更新欄位,例如客戶端希望與Education欄位分開更新欄位Category。
問題是我不能使用 PUT 請求來做到這一點,因為它會更新整個物件。如果該Category欄位實際上是null,而我只想更新這些Education欄位,我會得到ConstraintViolationException,因為該Category欄位是null。但它是null,我希望它null更進一步。
我可以使用 PATCH 請求來做到這一點:
@PatchMapping(path = "/{id}", consumes = "application/merge-patch json")
public ResponseEntity<Employee> patchEmployee(@PathVariable Long id, @RequestBody JsonMergePatch jsonMergePatch) throws JsonPatchException, JsonProcessingException {
Employee employee = employeeDataService.findById(id).orElseThrow(() -> new ResourceNotFoundException("Employee not exist: id = " id));
Employee employeePatched = applyPatchToEmployee(jsonMergePatch, employee);
return ResponseEntity.ok(employeeDataService.save(employeePatched));
}
private Employee applyPatchToEmployee(JsonMergePatch jsonMergePatch, Employee targetEmployee) throws JsonPatchException, JsonProcessingException {
JsonNode patched = jsonMergePatch.apply(objectMapper.convertValue(targetEmployee, JsonNode.class));
return objectMapper.treeToValue(patched, Employee.class);
}
但問題是:如何部分驗證我的欄位?
例如,如果我發送一個帶有正文的 PATCH 請求:
{
"education":"HIGHER",
"eduName":"MIT",
"eduGraduationDate":"2020-05-05"
}
如何僅驗證這 3 個欄位?不是整個Employee物件?在這個例子中,正如我上面提到的,如果它沒有包含在補丁中,我想要這個Category欄位null并且我不想驗證它。
也許有一些更好的方法來部分更新物體,如果是這樣 - 哪個?
uj5u.com熱心網友回復:
您可以創建一個新的 DTO 物件,其中僅包含您希望包含在 PATCH 呼叫中的欄位,例如,
員工補丁Dto
public class EmployeePatchDto {
// Education related fields
@NotNull
private Education education;
@NotBlank
private String eduName;
@NotNull
private LocalDate eduGraduationDate;
// other fields, getters, setters ...
}
但是現在您仍然必須確保在呼叫 API 時考慮這些驗證。此外,您可以選擇使用@Valid這樣的方法在控制器方法級別驗證您的 DTO 類,
public ResponseEntity<Employee> patchEmployee(@PathVariable Long id, @Valid @RequestBody EmployeePatchDto employeeDto) throws JsonPatchException, JsonProcessingException {
我會把這個資源留給你。讀這個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/372976.html
上一篇:如何解決toMap中的空值
