我怎样才能将 ApiParam 传递给另一个变量的验证器?

How can I go about passing an ApiParam to a validator of another variable?

我有点不知所措,除了放弃让这个验证器像我希望的那样全面之外,我不确定我应该做什么。我有一个看起来很像这样的端点:

@PutMapping(value = "/v1/operation/{actionType}")
    public void operation(
        @ApiParam(value = "type", required = true, allowableValues = "retry-all, retry-parquet, re-drop")
        @PathVariable("actionType") RetryActionType actionType,

        @Null @RequestBody @Valid RetryDto retryDto
    ) throws Exception {...}

现在,retryDto 后面的 @Valid 注释是一个非常充实的验证器,可以确保 retryDto 是正确的。问题是,随着最近的发展和添加的额外功能,retryDto 的有效性现在取决于 actionType

我完全不知道如何在 retryDto 中包含 actionType。我的约束如下:

  1. 我无法更改此端点。例如,我不能使 actionType not 成为 ApiParam,也不能使 retryDto not 成为 RequestBody。至少我不这么认为。如果你能想到一种智能的方法来保持端点 ("/v1/operation/{actionType}") 相同,接受 {actionType} 作为 ApiParam 请求主体但是,比如说,他们两者都可以做成一个对象,看起来像这样:

    @PutMapping(value = "/v1/operation/{actionType}")
    public void operation(
            @??? @??? @??? NewTypeThatIsActionTypeAndRetryDto x
        ) throws Exception {...}
    

    我会同意的。同样,NewType... 必须能够接受 ApiParam 和 RequestBody。怀疑这是可能的,但我不是专家。

  2. 我无法让客户端在 retryDto 的 RequestBody 中包含 actionType。这并不意味着如果你们中的任何人知道我可以自动将 actionType 添加到 retryDto 的方法,那将是不可接受的。换句话说,我可以更改 retryDto 以接受 actionType "automatically"。当然,不用说我的验证器必须能够看到它。

我想就是这样。我希望我能以某种方式自动将 actionType 添加到 retryDto。也许有什么方法可以让 @Valid 接受一个变量作为参数?我很确定注释必须采用常量......但也许有某种方法?

也许完全是别的东西?很想听到回音。谢谢

对于任何想知道的人,我几个小时前就弄明白了。在我的函数内部,我正在调用另一个实际使用 retryDto 参数的函数。我将验证器放在该函数的定义中,它起作用了!我愚蠢地认为它只能在 api 函数内部工作,但我错了。

@PutMapping(value = "/v1/operation/{actionType}")
    public void operation(
        @ApiParam(value = "type", required = true, allowableValues = "retry-all, retry-parquet, re-drop")
        @PathVariable("actionType") RetryActionType actionType,

        @Null @RequestBody RetryDto retryDto
    ) throws Exception
    {
     ...
            retryDto.setActionType(actionType);
            retryService.retry(actionType, retryDto);
     }
public void retry(RetryActionType actionType, @Valid RetryDto retryDto)

成功了!最后更改了 retryDto 以包含它,所以这是唯一的警告。可能不是真正的解决办法,如果有人有更好的想法,那就去做吧。