在我的 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 参数需要特定验证,例如最小/最大长度,或某个字符集。 这可能吗?
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"
因此,虽然两者都不是梦想的答案,但我认为它们可以很好地互补。
实际答案:
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 上测试了这个