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

在OpenApi 3.0中生成属性作为模式定义

戚飞雨
2023-03-14

当使用swagger 2.0时,java。util。Currency类作为一个单独的定义生成。但当我们生成OpenAPI 3.0时,我们遇到了一个问题,即swagger core将其作为属性生成。

我们有f.e.这门课:

import java.util.Currency; 

public class Wrapper {
   private Currency currency;
}

根据这段代码,我们使用以下插件配置生成openapi规范:

      <plugin>
            <groupId>io.swagger.core.v3</groupId>
            <artifactId>swagger-maven-plugin</artifactId>
            <version>2.0.9</version>
            <configuration>
                <outputFileName>openapi</outputFileName>
                <outputFormat>YAML</outputFormat>
                <outputPath>....</outputPath>
                <resourcePackages>...</resourcePackages>
            </configuration>
            <executions>
                <execution>
                    <phase>compile</phase>
                    <goals>
                        <goal>resolve</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

生成时,这将导致此组件定义

components:
  schemas:
    Wrapper:
      type: "object"
      properties:
        currency:
          type: object
          properties:
            currencyCode:
              type: string
            defaultFractionDigits:
              type: integer
              format: int32
            numericCode:
              type: integer
              format: int32
            displayName:
              type: string
            symbol:
              type: string

然后,我们使用以下插件在另一个项目中生成类:

生成类的代码构成了此openapi规范:

        <plugin>
            <groupId>org.openapitools</groupId>
            <artifactId>openapi-generator-maven-plugin</artifactId>
            <version>3.2.0</version>
            <executions>
                <execution>
                    <id>openapi-generation</id>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <inputSpec>${project.basedir}/src/main/resources/swagger.yaml</inputSpec>
                        <language>java</language>
                        <library>jersey2</library>
                        <generateSupportingFiles>false</generateSupportingFiles>
                        <configOptions>
                            <booleanGetterPrefix>is</booleanGetterPrefix>
                            <dateLibrary>threetenbp</dateLibrary>
                            <import-mappings>
                                Currency=java.util.Currency
                            </import-mappings>
                        </configOptions>
                        <generateApis>false</generateApis>
                        <generateApiDocumentation>false</generateApiDocumentation>
                        <generateModelTests>false</generateModelTests>
                        <generateModelDocumentation>false</generateModelDocumentation>
                    </configuration>
                </execution>
            </executions>
        </plugin>

这将产生一个名为WrapperMoney cy的类。--导入映射选项似乎不起作用,因为它是一个属性而不是模式。如果货币将作为单独的模式定义生成,这将有效。

是否有任何方法可以对属性进行注释,使java。util。货币将生成为模式?大致如下:

components:
  schemas:
    Wrapper:
      type: "object"
      properties:
        currency:
           $ref: "components/schemas/Currency"

    Currency:
      type: object
      properties:
        currencyCode:
          type: string
        defaultFractionDigits:
          type: integer
          format: int32
        numericCode:
            type: integer
            format: int32
        displayName:
          type: string
        symbol:
          type: string

或者有没有办法将导入映射选项绑定到属性而不是对象?

共有1个答案

凌和悦
2023-03-14

好吧,您可以考虑一种解决方法:将注释@Schema(ref="货币")添加到货币字段将使插件跳过生成属性。不幸的是,它也不会为货币类生成模式定义:

components:
  schemas:
    Wrapper:
      type: object
      properties:
        currency:
          $ref: '#/components/schemas/Currency'

我不确定这是否是您的问题,因为您正在将其映射回java。util。无论如何,货币。但如果是这样的话,还有另一种黑客攻击:你可以提供一个带有部分模式(只是货币定义)的静态文件,并配置插件将其与生成的模式(openapiFilePath参数)合并。

插件配置:

      <plugin>
            <groupId>io.swagger.core.v3</groupId>
            <artifactId>swagger-maven-plugin</artifactId>
            <version>2.0.9</version>
            <configuration>
                ...
                <openapiFilePath>src/main/resources/currency.yaml</openapiFilePath>
                ...
            </configuration>
            ...
      </plugin>

通货yaml:

components:
  schemas:
    Currency:
      type: object
      properties:
        currencyCode:
          type: string
        defaultFractionDigits:
          type: integer
          format: int32
        numericCode:
          type: integer
          format: int32
        displayName:
          type: string
        symbol:
          type: string

这是一个黑客,我知道,但是如果没有其他选择...

 类似资料:
  • 现在,我想生成一些样板服务器端代码:控制器及其方法。我的API将使用ASP.NET Core2编写。那么,是可能使用某种发电机还是我应该手动? 附言。我知道我可以生成客户端代码,但我现在不需要它...

  • 我需要为搜索API定义Swagger/OpenAPI V3.0文件。我的请求可以指定地理空间坐标(经度和纬度)或(邮政编码和国家代码)或(城市和州和国家代码)。除了这些,我还有几个更强制的属性,比如距离和距离单位。 我知道如何在JSON模式中做到这一点 但我很难用大摇大摆的方式来定义它。OpenAPI3.0允许One of和anyOf构造,但如果我试图在required部分使用它,swagger

  • 使用自定义属性扩展JSON模式有效吗? 我问这个问题的原因是,因为我使用一个模式来为该模式描述的JSON呈现一个表单(模式中描述的每个属性都用作带有标签和某种输入的表单元素)。 能够使用一些我主要用于表单呈现的属性来扩展模式是很有用的,但是当使用模式来验证JSON对象本身时,就会忽略这些属性。 对于JSON对象,我可以有两种不同的表示形式(一种是模式,另一种是类似模式的对象,它具有自定义属性,我只

  • 我定义OpenAPI 3.0文档并使用OpenAPI-generator-cli-3.3.4。jar生成Java代码(DTO)。但我无法解决这个问题:

  • 使用Jackson(最新版本可以)为JAVA bean/POJO类生成一个JSON模式,这样它就可以正确地包含嵌套对象的结构,并且还希望向嵌套POJO添加自定义属性(在我的例子中,希望为每个嵌套POJO参数添加一个完全分类的classname属性)。 用例- 比如说,我有一个Person类,如下所示。我用这个人作为我某个操作的参数。- 这个问题肯定与此相关--如何使用jackson遍历生成的jso

  • 我正在使用JPA元模型生成http://relation.to/Bloggers/HibernateStaticMetamodelGeneratorAnnotationProcessor能够使用属性名称执行条件查询。 我正在通过ANT和hibernate-jpamodelgen-4.3.5生成元模型类。最终的http://mvnrepository.com/artifact/org.hiberna