Java 在OpenAPI为Jersey on demand生成的代码中启用异步服务器API

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替换响应,并添加@挂起的最终异步响应作为第一个

我们通过gradle(即OpenAPI生成器gradle插件)使用OpenAPI生成资源。一般来说,这很好用

生成的方法如下所示:

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,
 ...
然后我在模板中使用这些信息,以便有条件地为各个方法生成不同的签名(file
api.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}}