现在我自己找到了一个非常方便的解决方案:OpenAPI 为我们提供了扩展——我使用其中一个来解决问题。我在规范 JSON 中使用我的自定义x-async-enabled
扩展,如下所示:
"paths": {
"/fubaz": {
"get": {
"summary": "My Fubaz resource",
"operationId": "fubaz",
"x-async-enabled": true,
...
然后我在模板中使用这些信息,以便有条件地为各个方法(文件api.mustache
)生成不同的签名:
{{#operation}}
public {{#vendorExtensions.x-async-enabled}}void{{/vendorExtensions.x-async-enabled}}{{^vendorExtensions.x-async-enabled}}Response{{/vendorExtensions.x-async-enabled}} {{nickname}}({{#vendorExtensions.x-async-enabled}}@Suspended final AsyncResponse asyncResponse, {{/vendorExtensions.x-async-enabled}}{{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}},{{/allParams}})
throws Exception {
{{#vendorExtensions.x-async-enabled}}
delegate.{{nickname}}(asyncResponse, {{#allParams}}{{#isFormParam}}{{#isFile}}{{paramName}}InputStream, {{paramName}}Detail{{/isFile}}{{/isFormParam}}{{^isFile}}{{paramName}}{{/isFile}}{{^isFormParam}}{{#isFile}}{{paramName}}{{/isFile}}{{/isFormParam}}, {{/allParams}});
{{/vendorExtensions.x-async-enabled}}
{{^vendorExtensions.x-async-enabled}}
return delegate.{{nickname}}({{#allParams}}{{#isFormParam}}{{#isFile}}{{paramName}}InputStream, {{paramName}}Detail{{/isFile}}{{/isFormParam}}{{^isFile}}{{paramName}}{{/isFile}}{{^isFormParam}}{{#isFile}}{{paramName}}{{/isFile}}{{/isFormParam}}, {{/allParams}});
{{/vendorExtensions.x-async-enabled}}
}
{{/operation}}
当然,我还必须调整导入并在apiService.mustache
. 这对我有用,我现在可以简单地标记我想要使用异步服务器 API 处理的内容。