如何通过组合 2 个字段来使用 @NotEmpty?

How to use @NotEmpty by combining 2 fields?

我有以下要求。

@Data
public class ProductRequest {
    @NotEmpty
    private String code;

    @NotEmpty
    private String name;
}

我将此请求用于 2 种不同的方法,它们都只使用一个字段,不需要另一个字段。假设 methodA 在这个请求中使用 code 和 methodB 使用 name 字段(不需要其他字段)。因此,在这种情况下,我认为一种解决方案是对两种方法使用相同的请求,而不是创建 2 个单独的请求。那么,有什么可以使字段之一不为空吗?我也不确定它是否解决了我的问题,因为在这个场景中请求将不知道哪个 属性 不应该为空。有解决此问题的想法吗?

  1. 你可以用custom validator(spring,代码验证,没有javax。)

  2. 与javax.validation:

    缺点:你必须处理你的“验证结构”(@Valid vs @validated/如何通过group

  3. ...

您可以对约束进行分组,这样您就可以知道在每种情况下要验证哪些属性。第一步是将属性 groups 添加到 javax 验证注释中。为此,您需要创建一些标记接口,一个用于您的每个用例:

public interface MethodA { } // You should name this properly, it is just for demonstration purposes

public interface MethodB { }

然后你需要在你的注解中配置groups属性:

@Data
public class ProductRequest {
    @NotEmpty(groups = MethodA.class)
    private String code;

    @NotEmpty(groups = MethodB.class)
    private String name;
}

最后一步是使用 @Validated 而不是 @Valid 来触发数据验证。大致如下:

@RequestMapping(value = "/methodA", method = RequestMethod.POST)
public String methodA(@Validated(MethodA.class) @RequestBody ProductRequest productRequest) {
    (...)
}

@RequestMapping(value = "/methodB", method = RequestMethod.POST)
public String methodB(@Validated(MethodB.class) @RequestBody ProductRequest productRequest) {
    (...)
}

您可以在以下在线资源中阅读更多相关信息: