java - 在 OpenAPI 中启用异步服务器 API 为 Jersey 按需生成代码

标签 java jersey-2.0 openapi-generator

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

生成的方法如下所示:

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

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

理论上,我们可以将所有生成的同步方法更改为异步方法,即调整模板文件 api.mustacheapiService.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/

相关文章:

java - java 和 .net 应用程序之间的身份验证

java - 使用迭代优化 HashMap

java - 如何将依赖项注入(inject) JerseyTest?

java - 在 WildFly 8.1 上运行 Jersey2 REST 客户端时出现问题

openapi - 将 OpenAPI 3.0 转换为 Swagger 2.0

java - 使用按钮上的 OnClickListener 返回 Android 列表中的位置

java - hibernate 5 : Inserting Data

spring-boot - Spring Boot + Jersey 类型过滤器 - 服务消耗 MULTIPART_FORM_DATA 的错误请求 400

openapi - 将OpenAPI Generator与OpenAPI 3.0一起使用时, "Unrecognized token openapi"错误是什么意思?

java - Swagger 根据枚举值生成子类型