1

我有以下要求。

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

    @NotEmpty
    private String name;
}

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

4

2 回答 2

0

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

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

于 2021-11-13T00:07:20.163 回答
0
  1. 您可以使用自定义验证器(spring,代码验证,没有 javax。)

  2. 使用 javax.validation:

    • 听起来很适合您的场景。
    • 当然也可以通过自定义约束来实现。(类似于 1。)

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

  3. ...

于 2021-11-12T17:12:11.383 回答