我怎样才能将 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
。我的约束如下:
我无法更改此端点。例如,我不能使 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。怀疑这是可能的,但我不是专家。
我无法让客户端在 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 以包含它,所以这是唯一的警告。可能不是真正的解决办法,如果有人有更好的想法,那就去做吧。
我有点不知所措,除了放弃让这个验证器像我希望的那样全面之外,我不确定我应该做什么。我有一个看起来很像这样的端点:
@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
。我的约束如下:
我无法更改此端点。例如,我不能使
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。怀疑这是可能的,但我不是专家。我无法让客户端在 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 以包含它,所以这是唯一的警告。可能不是真正的解决办法,如果有人有更好的想法,那就去做吧。