java - 如何将 ApiParam 传递给另一个变量的 validator ?

标签 java spring-boot spring-validator

我有点困惑,不知道除了放弃让这个 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 感到非常困惑。我的限制如下:

  1. 我无法更改此端点。例如,我无法将 actionType 设为 ApiParam,也无法将 retryDto 设为 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 的方法,那将是 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/

相关文章:

java - 开始Java : passing to a constructor thru event listener

java - 待遇到类内场。通过 getter 还是显式?

java - 无法使用 Spring Boot Security 登录

java - 如何进行分页请求 - Spring boot

Hibernate validator 单元测试

java,使用字典进行zip?

java - 使用 Java RegEx 查找以大写字母开头并包含小写字母的单词

java - 如何在 Spring 中 Autowiring 依赖项/外部 jar 中的组件?

spring-mvc - Spring boot rest API @Valid @ExceptionHandler 只在 RestController 中工作

java - Spring MVC 绑定(bind)结果有错误返回