我有点困惑,不知道除了放弃让这个 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 {...}
现在,retryDto
后面的 @Valid
注释是一个非常充实的 validator ,可确保 retryDto
是正确的。问题是,随着最近的发展和添加的额外功能,retryDto 的有效性现在取决于 actionType
。
我对如何在 retryDto
中包含 actionType
感到非常困惑。我的限制如下:
我无法更改此端点。例如,我无法将
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
的方法,那将是 Not Acceptable 。换句话说,我可以更改retryDto
以“自动”接受actionType
。当然,不用说我的 validator 必须能够看到它。
我想就是这样。我希望我能以某种方式自动将 actionType
添加到 retryDto
中。也许有某种方法可以让 @Valid 接受变量作为参数?我很确定注释必须采用常量......但也许有某种方法?
也许完全是别的东西?希望收到回复。谢谢
最佳答案
对于任何想知道的人,我几个小时前就弄清楚了。在我的函数内部,我调用了另一个实际使用 retryDto
参数的函数。我将 validator 放置在该函数的定义中并且它起作用了!我愚蠢地认为它只能在 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 以包含该内容,因此这是唯一的警告。也许不是真正的解决方案,如果有人有更好的想法,那就去吧。
关于java - 如何将 ApiParam 传递给另一个变量的 validator ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58665542/