标签: swagger-codegen

Swagger 避免删除公共前缀

如何跳过从 modelsEnum 名称中删除公共前缀?我有一个具有单个值的枚举(将来我将有更多值)并且 swagger code gen 插件使用枚举CODE而不是AIRPORT_CODE生成类

properties:
  type:
    enum: ["AIRPORT_CODE"]
    description: the type of location that is identified by the value
Run Code Online (Sandbox Code Playgroud)

enums swagger swagger-codegen

5
推荐指数
1
解决办法
3482
查看次数

Swagger 引用 externalFile 中的定义

我有很多 swagger 文件,使用相同的定义。我想将此定义移动到一个单独的文件并引用它们。

主要 swagger 文件如下所示:

swagger: '2.0'
info:
  version: 1.0.0
basePath: /api
tags:
  - name: MyClient
schemes:
  - http
consumes:
  - application/json
produces:
  - application/json
paths:
  /v1/myrequest:
    post:
      tags:
        - PassportCheck
      summary: ????????? ??????? ??
      operationId: passportCheck
      produces:
        - application/json
      parameters:
        - name: Body
          in: body
          required: true
          description: ''
          schema:
            $ref: '#/definitions/MyRequest'
      responses:
        '200':
          description: OK
          schema:
            $ref: '#/definitions/MyResponse'
        '400':
          description: Bad request
          schema:
            $ref: '#/definitions/Errors'

definitions: 
  MyRequest:
    type: object
    properties:
      some properties
Run Code Online (Sandbox Code Playgroud)

我尝试导入的文件保存到 exceptions.yaml(并保存到同一位置),看起来像:

swagger: '2.0'
info: …
Run Code Online (Sandbox Code Playgroud)

swagger swagger-2.0 swagger-codegen

5
推荐指数
1
解决办法
1663
查看次数

使 swagger codegen maven 插件从另一个 maven 依赖项访问 yaml 文件

我有一个用 Swagger 编写的 API,我想为其生成服务实现和客户端,并且它们必须位于单独的 maven 模块中。

我正在考虑将它们分成 3 个单独的 Maven 模块(或同一父 pom 的子模块)。

parent
 +- api
    +- src/main/resources/api/service.yaml
 +- client
 +- service
Run Code Online (Sandbox Code Playgroud)

然后在客户端和服务中我都会有swagger-codegen-maven-plugin. 这样两者都会同步,我只会在一个地方维护服务。其他客户端也可以依赖于api工件并从service.yamlSwagger API 定义生成它们的代码。

我的难点是如何让服务和客户端service.yaml在另一个 Maven 依赖项中引用?

这是我目前在 service 中所拥有的pom.xml,但它指的是 service 模块的本地资源,而不是apimaven 依赖项。

 <plugin>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-codegen-maven-plugin</artifactId>
        <version>${io.swagger.codegen.version}</version>
        <executions>
          <execution>
            <id>api</id>
            <goals>
              <goal>generate</goal>
            </goals>
            <configuration>            
<!-- can this refer to another maven dependency's resources? --> 
<inputSpec>${basedir}/src/main/resources/api/service.yaml</inputSpec>
              <language>spring</language>
              <library>spring-boot</library>
              <modelPackage>com.test.model</modelPackage>
              <apiPackage>com.test.api</apiPackage>
              <generateSupportingFiles>false</generateSupportingFiles>
              <configOptions>
                <java8>true</java8>
                <dateLibrary>java8</dateLibrary>
                <interfaceOnly>true</interfaceOnly>
              </configOptions>
            </configuration> …
Run Code Online (Sandbox Code Playgroud)

java maven swagger swagger-codegen swagger-codegen-maven-plugin

5
推荐指数
1
解决办法
3217
查看次数

如何从swagger codegen maven插件运行只生成目标

我正在使用 swagger codegen maven 插件从 swagger 规范生成服务器存根。如果我运行,mvn compile那么它会正确生成并编译项目。但是,有时我只想运行生成。

具体来说,我想避免编译整个项目并运行另一个在验证阶段运行的插件(checkstyles)。理想情况下,我想从 swagger 规范生成生成的类并编译这些类,而不是整个项目。

这里的用例是,在开发时,我可能需要更新规范并在整个项目无效(或不会,新规范)时重新生成。我读过你可以使用“前缀:目标”。我试过以下,但没有工作:

mvn swagger-codegen-maven-plugin:generate
mvn swagger-codegen:generate
mvn swagger:generate
mvn codegen:generate
Run Code Online (Sandbox Code Playgroud)

它给(例如)

在当前项目和存储库中可用的插件组 [org.apache.maven.plugins, org.codehaus.mojo] 中找不到前缀“codegen”的插件

我还读到您可以使用“groupid:artificatid:version_goal”,所以我尝试了:

mvn io.swagger:swagger-codegen-maven-plugin:2.4.0-SNAPSHOT:generate
Run Code Online (Sandbox Code Playgroud)

这似乎更进一步,但给出了错误

无法执行目标 io.swagger:swagger-codegen-maven-plugin:2.4.0-SNAPSHOT:generate (default-cli) on project com.carus.api.base:目标 io 的参数“inputSpec”、“language” .swagger:swagger-codegen-maven-plugin:2.4.0-SNAPSHOT:generate 丢失或无效

我的 pom 结构有点复杂。有几个 API。每个人在某些方面都是自己的项目。它们有一个共同的父 pom 和执行目标,项目 pom 只设置某些变量。用作 inputSpec 的变量在项目 pom 中定义,但在基本 pom 中定义了语言。(这里提到的 .base 项目实际上是基础 pom 所在的位置,并且是一个抽象包 ( <packaging>pom</packaging>)。如果我指定一个特定的项目,我会得到同样的错误,但指的是该项目。

问题:

  1. 我什至可以通过一个目标实现我想要的(从规范生成代码并编译该代码而不是整个项目)吗?
  2. 如何找出用于“前缀:目标”语法的“前缀”?

我最接近的是 run mvn generate-sources -Dcheckstyle.skip=true。这会生成,但我认为它不会编译生成的类。所以我必须在 Eclipse 中清理项目以触发它重新编译。

maven swagger-codegen

5
推荐指数
1
解决办法
3114
查看次数

使用 swagger-codegen maven 插件生成代码时删除默认实现

我必须从 yaml 文件生成代码,在我的 swagger maven 插件中:

<configOptions>
  <java8>true</java8>
  <sourceFolder>src/main/java</sourceFolder>
  <interfaceOnly>true</interfaceOnly>
  <dateLibrary>java8</dateLibrary>
  <singleContentTypes>true</singleContentTypes>
</configOptions>
Run Code Online (Sandbox Code Playgroud)

即使它说 iinterfaceOnly>true 但是代码生成器生成一个具有默认实现的接口,如下所示:

@ApiOperation(value = "", nickname = "billetsFichiersHealthGet", notes = "Obtient l'état de santé de l'API. ", tags={  })
    @ApiResponses(value = { 
        @ApiResponse(code = 200, message = "OK"),
        @ApiResponse(code = 200, message = "Erreur", response = Error.class) })
    @RequestMapping(value = "/bills/health",
        produces = "application/json", 
        consumes = "",
        method = RequestMethod.GET)
    default ResponseEntity<Void> billetsFichiersHealthGet() {
        if(getObjectMapper().isPresent() && getAcceptHeader().isPresent()) {
        } else {
            log.warn("ObjectMapper or HttpServletRequest not configured …
Run Code Online (Sandbox Code Playgroud)

java maven-plugin swagger-codegen

5
推荐指数
1
解决办法
2126
查看次数

为什么鉴别器属性被序列化两次?

我在组件模式中使用 OpenAPI 3.0 继承,并且我有由 openapi-generator(使用 Jackson)生成的(Java)类。

为什么鉴别器属性在生成的 JSON 中被序列化两次?

这是一个 JHipster API-First 项目,它应该使用 openapi-generator 来生成 Java 模型(带有 Jackson 注释的 POJO)和 API 控制器(与 Spring 的 @Api 注释的接口)。

通过遵循 OpenAPI 3.x 文档/示例,似乎discriminator还必须在properties架构列表中指定所使用的属性。

这样,生成的 Java 类似乎与带有注释的多态类型处理的 Jackson 指南(此处)不同,其中用作鉴别器的属性不能出现在类中。相反,生成的代码还包含此属性作为具有 getter/setter 的类属性。这会导致 JSON 输出两次包含该属性,如下所示。

我还尝试从 OpenAPIproperties列表中删除该属性,而保留完整的discriminator部分;这样生成的代码对应于杰克逊的指导方针,序列化工作得很好。另一方面,我在反序列化过程中遇到错误,因为在目标类中找不到(已删除)属性。

遵循 OpenAPI 3.x 文档指南:

TicketEvent:
  type: object
  description: A generic event
  discriminator:
    propertyName: type
  required:
    - id
    - sequenceNumber
    - timestamp
    - type
  properties:
    id:
      type: integer
      format: int64 …
Run Code Online (Sandbox Code Playgroud)

java jackson swagger swagger-codegen openapi-generator

5
推荐指数
1
解决办法
3154
查看次数

NSwag:如何在 C# -&gt; Swagger -&gt; C# 客户端中使用自定义值对象类型?

我有一个在输入和输出中都使用Noda Time类型的 API 。使用默认的 Noda Time 序列化格式(基本上是 ISO-8601 格式)将类型序列化为 JSON 中的字符串。

我有一个看起来像这样的对象:

public class NodaTimeDataStructure
{
    public System.DateTime DateTime { get; set; }
    public DateInterval DateInterval { get; set; }
    public DateTimeZone DateTimeZone { get; set; }
    public Duration Duration { get; set; }
    public Instant Instant { get; set; }
    public Interval Interval { get; set; }
    public IsoDayOfWeek IsoDayOfWeek { get; set; }
    public LocalDate LocalDate { get; set; }
    public LocalDateTime LocalDateTime { get; set; …
Run Code Online (Sandbox Code Playgroud)

c# swagger nodatime swagger-codegen nswag

5
推荐指数
1
解决办法
2867
查看次数

使用 ng-swagger-gen 生成枚举

我想从 SpringBoot Rest 服务在 Angular 应用程序中生成模型,为此我使用 ng-swagger-gen 插件。但不知何故,枚举仅作为内联字符串值生成,而不是作为 Enum 类生成,因此每次我必须自己键入字符串值或在 Typescript 中创建 Enum 对象时。

@Data
public class DummyClass {
   private DummyEnum dummyEnum;
}

public enum DummyEnum {
    One,
    Two,
    Three
}
Run Code Online (Sandbox Code Playgroud)

并且只生成 1 个代表模型的文件:

export interface DummyClass {
dummyEnum?: 'One' | 'Two' | 'Three';
}
Run Code Online (Sandbox Code Playgroud)

swagger 定义如下所示:

"definitions": {
"DummyClass": {
  "type": "object",
  "properties": {
    "dummyEnum": {
      "type": "string",
      "enum": [
        "One",
        "Two",
        "Three"
      ]
    }
  },
  "title": "DummyClass"
 }
}
Run Code Online (Sandbox Code Playgroud)

相反,当我手动将定义更改为此时,一切看起来都不错,生成了 2 个文件,1 个类和 1 …

enums swagger swagger-codegen angular

5
推荐指数
0
解决办法
487
查看次数

无法为 Scala 中的枚举列表生成正确的招摇

在我们的 scala 应用程序中为枚举列表生成 swagger 文档时,生成的 swagger 定义只是空对象。为枚举生成 swagger 文档时,一切都按预期进行,仅在处理枚举列表时才如此。

在 scala 中有多种创建枚举的方式,我们的代码库使用这种方式:

sealed trait AnswerEnum { val value: String }
case object YES extends AnswerEnum { val value = "YES" }
case object NO extends AnswerEnum { val value = "NO" }
Run Code Online (Sandbox Code Playgroud)

假设我们有一个 API,它只有一个端点,预期请求看起来像这样:

case class SomeRequest(answers: Seq[AnswerEnum])
Run Code Online (Sandbox Code Playgroud)

我们想要产生一些招摇,所以我们注释它,它看起来像这样:

@ApiModel(description = "Example Request")
case class SomeRequest(
    @ApiModelProperty(value = "List of answers", required = true) answers: Seq[AnswerEnum]
)
Run Code Online (Sandbox Code Playgroud)

然后在我们的 swagger 中留下一个定义,如下所示:

"AnswerEnum": {
    "type": "object"
}
Run Code Online (Sandbox Code Playgroud)

虽然我们希望得到的是这样的:

"AnswerEnum": {
    "type": "string", …
Run Code Online (Sandbox Code Playgroud)

enums scala traits swagger swagger-codegen

5
推荐指数
0
解决办法
345
查看次数

适用于 shopware 6 的 Python swagger-client

再会,

我已经通过我的 GitLab ci pipline 中的 swagger-codegen-cli (v3) docker 映像为 Shopware 6 商店生成了一个 python 客户端。

我遇到的问题是每个端点都返回空数据,但奇怪的是,当我调试客户端时,我可以通过检查器看到数据,但是在返回数据之前的一个步骤中,它尝试反序列化数据并返回里面没有任何数据的字典。

return_data = response_data
if _preload_content:
    # deserialize response data
    if response_type:
        return_data = self.deserialize(response_data, response_type)
Run Code Online (Sandbox Code Playgroud)

这是从__call_api()函数。当我检查 response_data 时,我可以看到它包含我需要的数据,但 deserialize() 返回: {'data': None, 'included': None, 'links': None, 'meta': None}

我知道我可以将参数 _preload_content 设置为 false,但随后我将原始请求响应作为字节字符串获取,这违背了使用 swagger 客户端的目的。

  • 是不是我店的规格有问题?
  • 代码生成器工作不正常吗?
  • 或者是来自swagger的python生成器的问题?

编辑:

我将问题缩小到__init__()所有继承自 Success 类的 Response 类的功能:

    def __init__(self, data=None, links=None, *args, **kwargs):  # noqa: E501
        """InlineResponse200156 - a model defined in Swagger"""  # …
Run Code Online (Sandbox Code Playgroud)

python-3.x swagger shopware openapi swagger-codegen

5
推荐指数
0
解决办法
128
查看次数