我正在使用openapi codegen版本4.2.2
和openapi规范3.0.0
从yaml文件生成java服务器API,如下所示:
openapi生成器generate-i测试。yaml-g spring-o/tmp/springTest
我遇到的问题是,生成的代码试图导入一个不存在的类。API应该接受pet类型的对象并返回相同的pet。宠物应该是猫、狗或蜥蜴。我使用了openapi规范中的继承示例,并从中构建了以下yaml文件:
openapi: 3.0.0
info:
version: 1.0.0
title: Three Pets
termsOfService: http://swagger.io/terms
tags:
- name: test
paths:
/echoPet:
post:
tags:
- test
summary: Return input
description: Send pet get pet
operationId: echoPet
parameters:
- name: pet
in: query
schema:
oneOf:
- $ref: '#/components/schemas/Cat'
- $ref: '#/components/schemas/Dog'
- $ref: '#/components/schemas/Lizard'
responses:
"200":
description: Pet sucesfully returned
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/Pet'
servers:
- url: https://localhost:8080/v2
- url: http://localhost:8080/v2
components:
schemas:
Pet:
type: object
required:
- pet_type
properties:
pet_type:
type: string
discriminator:
propertyName: pet_type
mapping:
cachorro: Dog
Cat:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Cat`
properties:
name:
type: string
huntingSkill:
type: string
description: The measured skill for hunting
enum:
- clueless
- lazy
- adventurous
- aggressive
Dog:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Dog`
properties:
bark:
type: string
packSize:
type: integer
format: int32
description: the size of the pack the dog is from
default: 0
minimum: 0
Lizard:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Lizard`
properties:
lovesRocks:
type: boolean
https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.1.md#discriminator-反对
据我所知,它应该生成一个API,可以接受以下类型之一:猫、狗、蜥蜴。(如果我在这里使用Pet,验证表明,Pet不是object类型)生成的EchoPetApi。java将导入用于:
import org.openapitools.model.OneOfCatDogLizard;
import org.openapitools.model.OneOfPet;
但是这些类不存在,这会使代码不可编译。我在org.openapitools.model包里只有:
Cat.java
CatAllOf.java
Dog.java
DogAllOf.java
Lizard.java
LizardAllOf.java
Pet.java
这是猫、狗和蜥蜴。java看起来和预期的一样,都扩展了Pet。java,但Catalof、DogAllOf和LizardAllOf没有扩展任何内容,只具有各自类中的属性和稍微不同的hashCode()方法。
这里是EchoPetApi.java与不存在的导入(前两个,包后):
/**
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (4.2.2).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
package org.openapitools.api;
import org.openapitools.model.OneOfCatDogLizard;
import org.openapitools.model.OneOfPet;
import io.swagger.annotations.*;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.Valid;
import javax.validation.constraints.*;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2019-12-18T11:27:04.474+01:00[Europe/Berlin]")
@Validated
@Api(value = "echoPet", description = "the echoPet API")
public interface EchoPetApi {
default Optional<NativeWebRequest> getRequest() {
return Optional.empty();
}
@ApiOperation(value = "Return input", nickname = "echoPet", notes = "Send pet get pet", response = OneOfPet.class, tags={ "test", })
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Pet sucesfully returned", response = OneOfPet.class) })
@RequestMapping(value = "/echoPet",
produces = { "application/json" },
method = RequestMethod.POST)
default ResponseEntity<OneOfPet> echoPet(@ApiParam(value = "", defaultValue = "null") @Valid OneOfCatDogLizard pet) {
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
}
}
如果我使用openapi codegen的validate函数,它不会返回任何错误:
$ openapi-generator validate -i test.yaml
Validating spec (test.yaml)
No validation issues detected.
我对你的openapi规范做了一些修改,让它在我这边工作
首先要更改的是API的参数/输入。将对象作为查询字符串发送很复杂
parameters:
- name: pet
in: query
schema:
oneOf:
- $ref: '#/components/schemas/Cat'
- $ref: '#/components/schemas/Dog'
- $ref: '#/components/schemas/Lizard'
因此,请选择requestBody,并将其定义为:
requestBody:
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/Cat'
- $ref: '#/components/schemas/Dog'
- $ref: '#/components/schemas/Lizard'
然后,响应可以这样管理(one Of指令对您的情况不是强制性的):
responses:
"200":
description: Pet sucesfully returned
content:
application/json:
schema:
$ref: '#/components/schemas/Pet'
生成器现在将提供由Cat
,Dog
和Lizard
使用的接口
控制器将使用此接口,您将不再有编译/定义问题
我正在使用 https://github.com/OpenAPITools/openapi-generator 为我的应用编程接口创建一个客户端。它基本上工作正常,但是生成器创建了许多类型,这些类型封装了包括任何复杂性类型的参数,例如、、 例如 其中InlineObject11定义为 这有什么意义?为什么生成的客户端不接受流再平衡贸易文件(Stream rebalanceTradeFile),而不
我试图生成一个API客户端从v2 swagger文件openapi生成器cli。为此,我使用openapi生成器cli的docker容器,它将其版本报告为4.1.0-SNAPSHOT。 代码生成使用以下选项: 我还尝试将选项设置为true。 但是,生成的服务类不使用装饰器进行注释。因此,在我的组件中导入它们并在组件的构造函数中添加服务后,我无法使用它们。这就是我的组件的样子: 失败,因为userS
我们有一个openapi文件(已验证),用于声明响应头,例如。 使用openapi生成器项目(maven或cli)生成的java webclient客户端,调用的返回类型不包括响应头,ApiClient类中的invokeAPI方法也不允许访问响应头。实际上,ApiClient invoke方法返回的是返回类型的Mono/Flux,因此不允许获取响应头 据我所知,使用Spring Webclient
我已经用OpenAPI 3.0格式编写了一个API定义(https://swagger.io/docs/specification/basic-structure/).现在,我正试图生成Java Spring对象,就像我之前使用Swagger 2.0定义及其关联的Maven插件所做的那样。 到目前为止,我有一个基本的API定义,首先是: 在我的文件中,我添加了: 但是在执行,我得到以下错误: 有人
我在openapi v.3规范中有一个模型。我使用openapi生成器maven插件为库webclient(spring 5-webflux)生成java客户端。我想发送回客户端文件和http头。生成的代码没有获取响应标头的方法。 为客户端生成的代码不包含提供对响应头访问的代码。例如,如果我使用库resttemplate,则有一个方法public MultiValueMap getResponse
我使用的是openapi生成器maven-plugin 使用<代码> 在我的yaml服务定义文件中,描述我的REST操作(XML消息)。我有这样一个模式: 以及定义的服务: 我生成客户端代码。但是当我使用它时,发送到超文本传输协议请求的XML使用