使用不同验证策略创建和更新请求的单一模型

Single Model for create and update request with different validation strategy

我有一个 UserDTO。创建和更新请求都是一样的,但问题是必填字段对于不同的创建和更新请求是不同的。假设对于创建请求,城镇名称、地区和国家是强制性的,但对于更新请求,地区和国家是强制性的。如果我在任何字段上应用@NotNull,它将适用于两种请求类型。我该如何处理这种情况?

public class UserDTO {

    private String id;

    private String townName;

    private String area;

    private String country;
}

我们正在使用不同的模型解决相同的情况。例如,一个用于创建,一个用于更新。如果一个字段有很多常见的验证,我们将其设置为 Base class

验证组是解决这个问题的方法。这 link 帮助了我。

为验证分组的创建和更新创建一个接口。

import javax.validation.groups.Default;

public interface ValidationGroups {

    interface Create extends Default {

    }

    interface Update extends Default {

    }
}

在您的控制器中进行更改 class,如下所示。在相应的更新和创建方法中的 class 和 @Validated(Update.class) 和 @Validated(Create.class) 顶部添加 @Validated。

@RequestMapping(BASE_PATH)
@Validated
public class UserController {

    @PutMapping
    public Mono<ResponseEntity<UserDTO>> update(@PathVariable String id, @RequestBody @Validated(Update.class) UserDTO userDTO) {}
    
    @PostMapping
    public Mono<ResponseEntity<UserDTO>> create(@RequestBody @Validated(create.class) UserDTO userDTO) {}
}

现在在各个字段上应用验证组。对于两者的共同强制变量,不要在它们上面放置任何组或同时放置。

public class UserDTO {

    @NotNull(groups = Update.class)
    private String id;

    @NotNull(groups = Create.class)
    private String townName;

    // Either put both @NotNull(groups = {Create.class,Update.class}) or leave blank
    private String area;

    private String country;
}