【问题标题】:How to use @NotEmpty by combining 2 fields?如何通过组合 2 个字段来使用 @NotEmpty?
【发布时间】:2021-11-12 16:31:02
【问题描述】:

我有以下要求。

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

    @NotEmpty
    private String name;
}

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

【问题讨论】:

标签: java spring spring-boot annotations javax.validation


【解决方案1】:

您可以对约束进行分组,以便确定在每种情况下要验证哪些属性。第一步是将属性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) {
    (...)
}

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

【讨论】:

  • 尚未测试,但似乎是一种正确的方法。另一方面,我认为使用单个属性并通过@PathVariable @NotNull String name 传递它而不是使用请求类可能是个好主意。这是真的吗?
  • 这取决于您在 POST 方法中尝试执行的操作以及 name 的含义。你的意图是什么?
  • 我正在尝试更新名称字段。
  • 那么你不应该做一个路径变量。您的 REST 资源是 Product,您应该使用 PATCH 请求更新其 name 属性,为其提供请求正文。
  • 在请求中使用name参数怎么样?我应该为此使用 Request 类而不是来自 id 或 uuid 的参数吗?
【解决方案2】:
  1. 您可以使用 custom validator 来完成此操作(spring,代码验证,没有 javax。)

  2. 使用 javax.validation:

    • Groups 听起来非常适合您的场景。
    • 当然也可以通过Custom Constraint 实现。 (类似于 1。)

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

  3. ...

【讨论】:

  • 非常感谢您的解释。我查看了这些页面,但我不确定它们是否对我的情况有帮助。因为,如您所知,我的请求还应该需要知道哪个字段不应该为空。因此,如果您认为有可能,您能否在上面发布此请求的示例实现作为对您答案的更新?
  • 顺便说一句,我在您引用的页面上看不到 javax.validation Group 的正确示例定义。
猜你喜欢
  • 2019-07-14
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2016-01-05
  • 2012-05-09
  • 2013-02-21
  • 2020-07-21
相关资源
最近更新 更多