验证 Openapi 3.0 Spring Boot RESTful API 中的 URL 参数?

问题描述 投票:0回答:2

在我的 openapi 规范中,我为特定资源路径指定 URL 参数,如下所示:

paths:
  /some/path:
    get:
      summary: some summary 
      parameters:
        name: usefulParameter
        description:
        schema:
          type: string
          maxLength: 15

使用 openapi 3.0 codegen 生成一个 Spring Boot RESTful API,它会自动生成一个名称类似于 xxxxDelegate 的接口,该接口具有必须实现的方法,例如:

default ResponseEntity<Object> somePathGet(String usefulParameter) {
    getRequest().ifPresent(request -> {
        for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
            if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
                String exampleString = "null";
                ApiUtil.setExampleResponse(request, "application/json", exampleString);
                break;
            }
        }
    });
    return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
}

界面顶部有一条注释:

由 {@link YourApiController}} 调用的委托。 使用 {@link org.springframework.stereotype.Service} 带注释的类来实现此接口。

所以我就是这样做的,这导致我自己的类看起来像这样:

@Service
public class MyCustomClass implements xxxxDelegate {
    @Override
    public ResponseEntity<Object> somePathGet(String usefulParameter) {
    }
}

到目前为止,这工作得完美。我可以调用它并记录输入参数。我遇到的问题是,我似乎无法在任何地方找到有关如何为该输入参数分配验证的文档 - Openapi 'maxLength' 没有被应用,并且 Spring/Spring Boot 似乎没有应用提供一种对这些参数应用验证的方法,除非您使用模型类型类并注释成员。我宁愿避免这种情况,而是简单地告诉 API 此 URL 参数需要特定验证,例如最小/最大长度,或某个字符集 这可能吗?

spring-boot rest validation openapi url-parameters
2个回答
1
投票

x-field-extra-annotation: "@Email"

在 api 定义 yaml 的字段定义中。如果将自定义验证器放入 
org.openapitools.model

包中,则可以使用自定义验证器。

在服务器端 API 实现中,您需要将 

@Valid

注释放在要验证的任何参数前面。

这里是带有自定义验证的 UUID 方案的示例(请注意,yaml 中定义的验证规则对生成的 Spring-Java-Code 没有影响):

schemas: UUID: description: "Format: UUID" type: "string" pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$' minLength: 36 maxLength: 36 example: "097c9a34-ec4c-4766-b29b-f528db4a3ef8" x-field-extra-annotation: "@UUID"



0
投票

因此,虽然两者都不是梦想的答案,但我认为它们可以很好地互补。

实际答案:

当您将变量的类型指定为字符串时,OpenApi 3.0 允许您指定正则表达式模式。

parameters: - in: path name: countryCode schema: pattern: '^[a-z]{2}$' type: string description: two-letter country

正则表达式风格是 javascript,如果您想匹配整个字符串而不是在其中搜索,则需要 
^

&

$
-锚点。
此验证会自动应用,无需您向委托实现添加任何代码,这很好。但实现有点欠缺,因为它返回了 500 个错误,这显然是一个 4xx 问题,这有点不幸,但并不破坏交易。

我在 openapi-generator-maven-plugin 6.0.0 上测试了这个

© www.soinside.com 2019 - 2024. All rights reserved.