当前位置: 首页 > 知识库问答 >
问题:

openapi生成器/maven插件生成带有«、»字符的无效java代码

贝自怡
2023-03-14

我只是将代码从swagger代码生成器迁移到open api代码生成器。我通过maven插件使用生成器。我需要它为一个外部API(在我的控制之外)生成一个客户端,这里给出了使用的swagger文件。

我的插件设置如下:

<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>4.3.1</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <generateApiTests>false</generateApiTests>
                <generateModelTests>false</generateModelTests>
                <generateSupportingFiles>false</generateSupportingFiles>
                <environmentVariables>
                    <supportingFiles>
                        ApiClient.java,Authentication.java,OAuth.java,ApiKeyAuth.java,HttpBasicAuth.java,RFC3339DateFormat.java
                    </supportingFiles>
                </environmentVariables>
                <inputSpec>${project.basedir}/src/main/resources/api-tpz.json</inputSpec>
                <generatorName>java</generatorName>
                <configOptions>
                    <library>resttemplate</library>
                    <dateLibrary>java8</dateLibrary>
                </configOptions>
            </configuration>
        </execution>
    </executions>
</plugin>

为了有一个最小的例子,我把昂首阔步的来源去掉了:

{
    "swagger": "2.0",
    "info": {
        "description": "Api Documentation",
        "version": "1.0",
        "title": "Api Documentation",
        "termsOfService": "urn:tos",
        "contact": {

        },
        "license": {
            "name": "Apache 2.0",
            "url": "http://www.apache.org/licenses/LICENSE-2.0"
        }
    },
    "securityDefinitions": {
        "basicAuth": {
            "type": "basic"
        }
    },
    "security": [
        {
            "basicAuth": []
        }
    ],
    "host": "example.com",
    "basePath": "/api",
    "tags": [
    ],
    "paths": {
    },
    "definitions": {
        "GenericRow": {
            "type": "object",
            "title": "GenericRow",
            "additionalProperties": {
                "type": "object"
            }
        },
        "ResultList«GenericRow»": {
            "type": "object",
            "properties": {
                "offset": {
                    "type": "integer",
                    "format": "int64"
                },
                "overallCount": {
                    "type": "integer",
                    "format": "int64"
                },
                "results": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/GenericRow"
                    }
                }
            },
            "title": "ResultList«GenericRow»"
        }
    }
}

当生成器运行正常时,代码无效

@Override
  public boolean equals(java.lang.Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    ResultListGenericRow resultList«GenericRow» = (ResultListGenericRow) o;
    return Objects.equals(this.offset, resultList«GenericRow».offset) &&
        Objects.equals(this.overallCount, resultList«GenericRow».overallCount) &&
        Objects.equals(this.results, resultList«GenericRow».results);
  }

结果列表«GenericRow»完全错误。

另一方面,类的名称是正确生成的ResultListGenericRow只有变量名称处理错误。

如何解决这个问题?

编辑:

我无法控制给定的规范文件。我需要生成一个有效的客户端。大摇大摆的代码gen工作得很好(只是删除了特殊字符)。《迁移指南》中没有关于这方面的提示。如何使用新生成器获得等效代码?

共有1个答案

韦翰音
2023-03-14

当从swagger-codegen-cli切换到openapi-Generer-cli时,我也遇到了类似的问题。就我而言,在Swagger配置中添加forCodeGenerationin这样做有帮助:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.any())
            .build()
            .forCodeGeneration(true);
   }
}
 类似资料:
  • 我在openapi v.3规范中有一个模型。我使用openapi生成器maven插件为库webclient(spring 5-webflux)生成java客户端。我想发送回客户端文件和http头。生成的代码没有获取响应标头的方法。 为客户端生成的代码不包含提供对响应头访问的代码。例如,如果我使用库resttemplate,则有一个方法public MultiValueMap getResponse

  • 我试图在使用openapi 3规范设计的API中引入可为null的属性。其思想是始终将属性返回给客户端,无论其值是否为null。 YAML文件(我先尝试了,没有默认,结果相同): 生成Java代码: API的响应: 因此,无论属性是否为null,结果总是“present:true”。如果没有nullability,它就可以正常工作,除了从响应中删除不需要的null值。 有什么想法吗? P、 该物业

  • 不幸的是,SpringFox还不支持OpenAPI3,而且,当我只想将最初的yaml公开为JSON时,使用基于反射的生成器似乎毫无意义。

  • 我目前正在使用openapi生成器maven插件生成一个模型,但当该模型创建BigDecimal属性时,它没有添加正确的导入。例如: 当我手动添加导入时,模型编译成功,但我认为它会生成。 我尝试在配置部分添加导入映射,如下所示: 正如这里所建议的那样。 还尝试了以下方法: 但行为是一样的。 我正在使用openapi生成器版本5.0.0。我目前的配置是这样的:

  • 我们使用openapi生成器maven-plugin版本5.0.1来生成我们的API。我试图指定一个请求,包括一个DTO和一个文件。 第一个奇怪的事情是生成的代码不使用DTO,它基本上是扁平化字段,这样API就期望指定每个字段。然而,我们并不太关心这个问题,因为我们可以指定每个字段(尽管如果它像预期的那样工作会很好)。 杀死我们的问题是为应用编程接口和应用编程接口委托生成的类彼此不一致。生成的AP

  • 我从一个openapi规范(3.0.1)设计开始,用openapi生成器maven-plugin(5.1.0)生成代码,然后我使用springdoc-openapi-ui进行Spring引导(2.5.4)。 我需要手动将生成的代码中的大部分注释从io.swagger.annotations.*迁移到io.swagger.v3.oas.annotations.*https://springdoc.o