【问题标题】:Enabling the Asynchronous Server API in OpenAPI generated code for Jersey on demand在 OpenAPI 中启用异步服务器 API,按需为 Jersey 生成代码
【发布时间】:2019-09-04 11:49:45
【问题描述】:

我们通过 gradle(即 openapi-generator-gradle-plugin)使用 OpenAPI 来生成 Jersey 资源。一般来说,这工作正常。

生成的方法如下所示:

public Response getSomeFoo(@ApiParam(...) String someParam, ...) { ...

但我们也希望支持使用Asynchronous Server API 的方法。

理论上我们可以将所有生成的同步方法更改为异步方法,即调整模板文件api.mustacheapiService.mustache,我们将Response替换为void并添加@Suspended final AsyncResponse asyncResponse作为第一个参数(加上添加导入等)。

但是将所有请求从同步处理转换为异步处理对我们来说是没有意义的。

所以我的问题是:我们如何实现某种“切换”以在输入文件中指示我们想要为每种方法生成(同步/异步)什么样的实现?

我正在考虑编写一个新的生成器,它可以读取例如来自输入规范文件的标签并将其放入在模板文件中评估的布尔变量中。这可行吗?有没有类似的问题已经解决了?或者你对我有什么其他想法?

谢谢!

【问题讨论】:

    标签: java jersey-2.0 openapi-generator


    【解决方案1】:

    我自己现在找到了一个非常方便的解决方案: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 处理的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 2022-07-02
      • 2020-02-17
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      相关资源
      最近更新 更多