我有点烦,不知道我要做什么,而不仅仅是放弃使这个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更改为包括该内容,因此这是唯一的警告。也许不是一个真正的解决方法,如果有人有更好的主意,那就去吧。