3

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

生成的方法如下所示:

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

但我们也希望支持使用异步服务器 API的方法。

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

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

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

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

谢谢!

4

1 回答 1

3

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

于 2019-09-04T14:59:32.487 回答