@ConvertGroup 基于参数

@ConvertGroup based on parameter

我希望使用基于参数的组来实现 bean 验证。这个想法是让方法具有如下签名:

@POST
@Path("/id-{id}")
public SomeDTO updateProducer(@PathParam("id") String id, @MatrixParam("update") Class<ConvertGroupTarget> update, @Valid SomeDTO data);

这相当于显式 ConvertGroup 声明,例如:

@POST
@Path("/id-{id}")
public SomeDTO updateProducer(@PathParam("id") String id, @Valid @ConvertGroup(from=Default.class, to=/*some class that implements ConvertGroupTarget*/) SomeDTO data);

这有可能吗?我们正在使用 Jerseyhibernate-validator

编辑:这一切的目的。假设我想基于某些特定目的的验证组来验证 bean。例如,一些 bean 可以有不同的规则应用于创建和更新它。所以 bean 声明如下所示:

class SomeDTO {
    @NotNull(groups = {Create.class, Update.class})
    private String id;

    @NotNull(groups = {Create.class, Update.class})
    private String name;

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

    //getters, setters etc.
}

类 创建和更新只是一些标记 classes/interfaces 以提供组的类型化声明。

现在,假设 API 用户正在创建一个实体并且他创建了 POST /id-X123/;update=create。这里我只想验证ID和名称,但并不真正关心bean的something 属性。但是当 API 用户想要更新 bean 时,API 应该要求他甚至指定 something 属性。这通常是通过转换验证组来完成的——@ConvertGroup(from = Default.class, to = Create.class) 用于创建,@CovertGroup(from = Default.class, to = Update.class) 用于更新。但是,我希望跳过 ConvertGroup 注释的显式声明,并根据参数以编程方式执行此操作。

ConvertGroup 定义静态组转换,因此您无法对其进行参数化。您一劳永逸地定义它们。

我想你要做的是用一个组来调用Validator。我不使用 Jersey,所以我不知道他们是否有钩子,但你应该寻找的是:

Set<ConstraintViolation<SomeDTO>> violations =
    validator.validate(someDTO); // validate the default group

Set<ConstraintViolation<SomeDTO>> violations =
    validator.validate(someDTO, Update.class); // validate the Update group