我有点烦,不知道我要做什么,而不仅仅是放弃使这个Validator成为我想要的那样全面。我有一个看起来很像这样的端点:

@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 {...}


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

我对如何在actionType中包含retryDto感到迷茫。我的约束如下:


我无法更改此端点。例如,我不能使actionType不是ApiParam,也不能使retryDto不是RequestBody。至少我不这么认为。如果您可以想到一种使端点("/v1/operation/{actionType}")保持相同的聪明方法,可以将{actionType}接受为ApiParam和请求正文,但是,可以将它们都制成一个对象,如下所示:

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


我会很好的。同样,NewType...必须能够接受ApiParam和RequestBody。可以怀疑,但我不是专家。
我无法使客户端在retryDto的RequestBody中包含actionType。这并不意味着,例如,如果你们中的任何人都知道我可以自动将actionType添加到retryDto的方法,那将是不可接受的。换句话说,我可以更改retryDto以“自动”接受actionType。当然,我的验证者必须能够看到它。


我想就是这样。我希望可以以某种方式自动将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)


可行!最终将retryD更改为包括该内容,因此这是唯一的警告。也许不是一个真正的解决方法,如果有人有更好的主意,那就去吧。

09-27 23:53