Java 在OpenAPI为Jersey on demand生成的代码中启用异步服务器API
我们通过gradle(即OpenAPI生成器gradle插件)使用OpenAPI生成资源。一般来说,这很好用 生成的方法如下所示:Java 在OpenAPI为Jersey on demand生成的代码中启用异步服务器API,java,jersey-2.0,openapi-generator,Java,Jersey 2.0,Openapi Generator,我们通过gradle(即OpenAPI生成器gradle插件)使用OpenAPI生成资源。一般来说,这很好用 生成的方法如下所示: public Response getSomeFoo(@ApiParam(...) String someParam, ...) { ... 但我们也希望支持使用的方法 理论上,我们可以将所有生成的同步方法更改为异步方法,即调整模板文件api.mustache和apiService.mustache,其中我们用void替换响应,并添加@挂起的最终异步响应作为第一个
public Response getSomeFoo(@ApiParam(...) String someParam, ...) { ...
但我们也希望支持使用的方法
理论上,我们可以将所有生成的同步方法更改为异步方法,即调整模板文件api.mustache
和apiService.mustache
,其中我们用void
替换响应
,并添加@挂起的最终异步响应
作为第一个参数(加上增加进口等)
但是,将所有请求从同步处理转换为异步处理对我们来说没有意义
因此,我的问题是:我们如何实现某种“切换”,以便在输入文件中指示我们要为每个方法生成(同步/异步)什么样的实现
我正在考虑编写一个新的生成器,从输入规范文件中读取一个标记,并将其放入一个布尔变量中,该变量在模板文件中进行计算。这是否可行?是否已经解决了任何类似的问题?或者您是否有其他想法
谢谢!现在我自己找到了一个非常方便的解决方案:OpenAPI为我们提供了一个–我使用其中一个来解决这个问题。我在规范JSON中使用了我的自定义
x-async-enabled
扩展,如下所示:
"paths": {
"/fubaz": {
"get": {
"summary": "My Fubaz resource",
"operationId": "fubaz",
"x-async-enabled": true,
...
然后我在模板中使用这些信息,以便有条件地为各个方法生成不同的签名(fileapi.mustache
):
当然,我还必须调整导入,并在apiService.mustache
中执行基本相同的操作。这对我来说很有用,现在我可以简单地标记我想用异步服务器API处理的内容
{{#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}}