我们通过 gradle 使用 OpenAPI(即 openapi-generator-gradle-plugin)来生成 Jersey 资源。一般来说,这工作得很好。
生成的方法如下所示:
public Response getSomeFoo(@ApiParam(...) String someParam, ...) { ...
但我们也希望支持使用 Asynchronous Server API 的方法。
理论上,我们可以将所有生成的同步方法更改为异步方法,即调整模板文件 api.mustache
和 apiService.mustache
,其中我们替换 通过
,并添加 void
进行响应@Suspished Final AsyncResponse asyncResponse
作为第一个参数(加上添加导入等)。
但是将所有请求从同步处理转换为异步处理对我们来说没有意义。
所以我的问题是:我们如何实现某种“开关”来在输入文件中指示我们想要为每个方法生成(同步/异步)什么样的实现?
我正在考虑编写一个新的生成器来读取例如输入规范文件中的标签,并将其放入一个 boolean 变量中,该变量在模板文件中进行评估。这可行吗?有没有类似的问题已经解决了?或者你还有什么其他想法要告诉我吗?
谢谢!
最佳答案
现在我自己找到了一个解决方案,幸运的是非常方便:OpenAPI 为我们提供了 Extensions – 我使用其中之一来解决问题。我在规范 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 处理的内容。
关于java - 在 OpenAPI 中启用异步服务器 API 为 Jersey 按需生成代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57787784/