提问人:Panicking Developer 提问时间:9/25/2023 更新时间:9/25/2023 访问量:57
从 Swagger/OpenAPI 定义生成的方法中参数的顺序
Order of parameters in a method generated from Swagger/OpenAPI definition
问:
一点背景。在我的系统中,ServiceB 调用 ServiceA。ServiceA 提供了一个 Swagger/OpenAPI 定义,ServiceB 使用该定义来生成其客户端代码。
ServiceA 需要一些自定义标头参数,这些参数通过 addOperationCustomizer 方法添加到 GroupedOpenAPI。
@Bean
public GroupedOpenApi opeApiDefinitionBuilder() {
return GroupedOpenApi.builder()
.addOperationCustomizer(zzzHeaderParameterAdder)
.addOperationCustomizer(yyyHeaderParameterAdder)
.addOperationCustomizer(xxxHeaderParameterAdder)
.build();
}
// where xxxHeaderParameterAdder and others are an instance of
@Component
public class YYYHeaderParameterAdder implements OperationCustomizer {
@Override
public Operation customize(Operation operation, HandlerMethod handlerMethod) {
Parameter extraParam = new Parameter()
.in(ParameterIn.HEADER.toString())
.name("parameterXXX")
.schema(new Schema().type("string"))
.required(Boolean.TRUE);
operation.addParametersItem(extraParam);
return operation;
}
}
当使用带有 springdoc-openapi-ui 的 Spring Boot 2 时,流派化的 swagger 定义包含按操作注册的 revers 顺序添加的已定义参数(查询来自 endpoind 定义)。
"parameters" : [
{
"name" : "id",
"in" : "query",
"required" : true,
"schema" : {
"type" : "string"
},
},
{
"name" : "parameterXXX",
"in" : "header",
"required" : true,
"schema" : {
"type" : "string"
}
},
{
"name" : "parameterYYY",
"in" : "header",
"required" : true,
"schema" : {
"type" : "string"
}
},
{
"name" : "parameterZZZ",
"in" : "header",
"required" : false,
"schema" : {
"type" : "string"
}
}
因此,gernerated 客户端代码如下所示:
getWhatever(String id, String parameterXXX, String parameterYYY, String parameterZZZ) { body here}
升级到 Spring Boot 3 并切换到 springdoc-openapi-starter-webmvc-ui 后,参数顺序颠倒了
"parameters" : [
{
"name" : "id",
"in" : "query",
"required" : true,
"schema" : {
"type" : "string"
},
},
{
"name" : "parameterZZZ",
"in" : "header",
"required" : false,
"schema" : {
"type" : "string"
}
},
{
"name" : "parameterYYY",
"in" : "header",
"required" : true,
"schema" : {
"type" : "string"
}
},
{
"name" : "parameterXXX",
"in" : "header",
"required" : true,
"schema" : {
"type" : "string"
}
}
导致不同客户端代码的原因
getWhatever(String id, String parameterZZZ, String parameterYYY, String parameterXXX) { body here}
总结一下
// new client generated code
getWhatever(String id, String parameterZZZ, String parameterYYY, String parameterXXX) { body here}
// old client generated code
getWhatever(String id, String parameterXXX, String parameterYYY, String parameterZZZ) { body here}
编译器无法检测到此错误,因为所有参数都是字符串。
io.swagger.v3.oas.models.Operation 类没有允许操作顺序的属性。如何处理这个问题?
答: 暂无答案
评论