基于端点忽略来自 RequestBody 的 Dto 中的 属性(将一个 Dto 用于两个目的)
Ignore a property in Dto from RequestBody base on endpoint (use one Dto for two purpose)
我在数据库中有一个 Coupon Table,所以应用程序中有 CouponEntity 和 CouponDto。我的问题是关于用一个 Dto 处理两个端点。例如,我创建和更新端点,它们都使用 CouponDto。有一个业务角色我无法更新优惠券实体的 code
属性。如果客户端在请求中传递这个 属性 如何忽略它?
如果我使用 @JsonIgnore
,属性 将在我需要在创建 API 中获取它的两个端点中被忽略。我使用groups
进行验证并相互分开验证,但有时无法设置@JsonIgnore
。
创建优惠券:
@PostMapping("/create")
public ResponseEntity<?> createCoupon(@RequestBody CouponCodeDTO couponCodeDTO) {
return ResponseEntity.ok(couponService.create(couponCodeDTO));
}
更新优惠券:
@PutMapping("/update/{id}")
public ResponseEntity<?> updateCoupon(
@PathVariable Long id, @RequestBody CouponCodeDTO couponCodeDTO
) {
return ResponseEntity.ok(couponService.update(id, couponCodeDTO));
}
和 CouponDto:
public class CouponCodeDto extends BaseDto<Integer> {
@NotBlank
private String code;
private Integer availableCount;
@NotNull
private LocalDate startDate;
...
}
您可以使用 @JsonView
指定每个视图要 serialize/deserialize 的字段,并在端点上指定视图。
public class Views {
interface Update {}
interface Create extends Update {}
}
public class CouponCodeDto extends BaseDto<Integer> {
@NotBlank
@JsonView(Views.Create.class)
private String code;
@JsonView(Views.Update.class)
private Integer availableCount;
@NotNull
@JsonView(Views.Update.class)
private LocalDate startDate;
...
}
并在端点的请求主体上使用
@PutMapping("/update/{id}")
public ResponseEntity<?> updateCoupon(@PathVariable Long id,
@JsonView(Views.Update.class) @RequestBody CouponCodeDTO couponCodeDTO) {
@PostMapping("/create")
public ResponseEntity<?> createCoupon(
@JsonView(Views.Create.class) @RequestBody CouponCodeDTO couponCodeDTO) {
在这里你可以找到详细信息
https://www.baeldung.com/jackson-json-view-annotation
https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring
我在数据库中有一个 Coupon Table,所以应用程序中有 CouponEntity 和 CouponDto。我的问题是关于用一个 Dto 处理两个端点。例如,我创建和更新端点,它们都使用 CouponDto。有一个业务角色我无法更新优惠券实体的 code
属性。如果客户端在请求中传递这个 属性 如何忽略它?
如果我使用 @JsonIgnore
,属性 将在我需要在创建 API 中获取它的两个端点中被忽略。我使用groups
进行验证并相互分开验证,但有时无法设置@JsonIgnore
。
创建优惠券:
@PostMapping("/create")
public ResponseEntity<?> createCoupon(@RequestBody CouponCodeDTO couponCodeDTO) {
return ResponseEntity.ok(couponService.create(couponCodeDTO));
}
更新优惠券:
@PutMapping("/update/{id}")
public ResponseEntity<?> updateCoupon(
@PathVariable Long id, @RequestBody CouponCodeDTO couponCodeDTO
) {
return ResponseEntity.ok(couponService.update(id, couponCodeDTO));
}
和 CouponDto:
public class CouponCodeDto extends BaseDto<Integer> {
@NotBlank
private String code;
private Integer availableCount;
@NotNull
private LocalDate startDate;
...
}
您可以使用 @JsonView
指定每个视图要 serialize/deserialize 的字段,并在端点上指定视图。
public class Views {
interface Update {}
interface Create extends Update {}
}
public class CouponCodeDto extends BaseDto<Integer> {
@NotBlank
@JsonView(Views.Create.class)
private String code;
@JsonView(Views.Update.class)
private Integer availableCount;
@NotNull
@JsonView(Views.Update.class)
private LocalDate startDate;
...
}
并在端点的请求主体上使用
@PutMapping("/update/{id}")
public ResponseEntity<?> updateCoupon(@PathVariable Long id,
@JsonView(Views.Update.class) @RequestBody CouponCodeDTO couponCodeDTO) {
@PostMapping("/create")
public ResponseEntity<?> createCoupon(
@JsonView(Views.Create.class) @RequestBody CouponCodeDTO couponCodeDTO) {
在这里你可以找到详细信息
https://www.baeldung.com/jackson-json-view-annotation
https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring