基于端点忽略来自 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