在撰写本文时,OpenAPI 3规范相对较新.我正在努力寻找支持3.0版的任何文档生成器.
有谁知道支持OpenAPI v3.0的生成器?
我们正在使用具有许多可选功能的大型第三方 API。有 27 个端点,我们只需要 Maven 中的几个。我们正在使用服务器端生成。
如果您感兴趣,API 位于: https: //github.com/mjeffrey/psd2 理想情况下,我们只会生成并公开我们支持的 API。
是否可以只生成 API 端点列表或排除我们不想支持的端点?
我发现有可能只生成某些模型,但这不是我们需要的。-D apis 参数似乎在源代码中被视为布尔值。
https://github.com/OpenAPITools/openapi-generator#3---用法 https://github.com/OpenAPITools/openapi-generator/blob/master/docs/customization.md#selective- Generation
我还在考虑使用预处理器,这样我们就不需要手动编辑 yaml 文件(定期更新)。对于预处理 yaml 文件有什么建议吗?
我们使用 openapi 生成器来生成 REST 客户端。工作得非常好,直到我们开始在UPERCASE_UNDERSCORE格式中使用枚举。它去掉了下划线。这样做的主要问题是,由于属性名称与定义不匹配,因此在 Typescript 中转换此枚举变得非常痛苦。
这是一个 YAML 示例:
properties:
boostId:
type: string
maxLength: 50
type:
type: string
enum:
- BOOST_UNIQUE_ALERT_TYPE_COUNTER
- BOOST_UNIQUE_SOURCE_SYSTEM_COUNTER
Run Code Online (Sandbox Code Playgroud)
生产:
var BoostConfiguration;
(function (BoostConfiguration) {
/**
* @export
* @enum {string}
*/
var TypeEnum;
(function (TypeEnum) {
TypeEnum["UNIQUEALERTTYPECOUNTER"] = "BOOST_UNIQUE_ALERT_TYPE_COUNTER";
TypeEnum["UNIQUESOURCESYSTEMCOUNTER"] = "BOOST_UNIQUE_SOURCE_SYSTEM_COUNTER";
})(TypeEnum = BoostConfiguration.TypeEnum || (BoostConfiguration.TypeEnum = {}));
})(BoostConfiguration = exports.BoostConfiguration || (exports.BoostConfiguration = {}));
Run Code Online (Sandbox Code Playgroud)
由于某种原因,它删除了“BOOST”,并删除了下划线。我已经尝试过enumPropertyNaming=original和modelPropertyNaming=original,似乎都没有改变任何东西(在枚举中)。这是我们的生成器脚本:
openapi-generator generate -i api/socosApi.yaml -g typescript-axios -o generated-sources/api --additional-properties=enumPropertyNaming=original,modelPropertyNaming=original
Run Code Online (Sandbox Code Playgroud) 我正在使用openapi-codegen version 4.2.2并openapi specification 3.0.0从 yaml 文件生成一个 java 服务器 API,如下所示:
openapi-generator generate -i test.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": …Run Code Online (Sandbox Code Playgroud) 我正在使用OpenApi SpringBoot生成器生成控制器接口和模型。这将创建具有JsonNullable<String>可空字段的模型类。但是,我收到一个Jackson类型定义错误,而POST请求是在可空字段中存在值的情况下发送的。
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.openapitools.jackson.nullable.JsonNullable` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('TG')
at [Source: (PushbackInputStream); line: 3, column: 19] (through reference chain: com.example.rest.CreateRequest["displayName"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1452) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1028) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:371) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:323) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1373) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:171) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:161) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:369) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013) ~[jackson-databind-2.9.7.jar:2.9.7]
at …Run Code Online (Sandbox Code Playgroud) 我正在将我的 API 从 Swagger 2.0 迁移到 OpenAPI 3.0。在 DTO 中,我有一个指定为字节数组的字段。DTO 的 Swagger 定义:
Job:
type: object
properties:
body:
type: string
format: binary
Run Code Online (Sandbox Code Playgroud)
使用上面的定义,swagger 代码生成器生成一个接受byte[]数组作为主体字段的对象new Job().setBody(new byte[1])。
将 API 定义转换为 OpenAPI 后,该对象的定义保持不变,但 openapi 代码生成器现在需要org.springframework.core.io.Resource而不是byte[]( new Job().setBody(org.springframework.core.io.Resource))。在我的代码中有一些地方我必须序列化 Job 对象,但它不再可能,因为Resource没有实现可序列化。
作为一种解决方法,我将类型更改为object:
Job:
type: object
properties:
body:
type: object
Run Code Online (Sandbox Code Playgroud)
现在我必须将身体投射到String然后转换到byte[]任何地方,我宁愿byte[]像以前一样拥有类型。
如何指定类型为byte[]使用 OpenAPI 3.0?
我正在尝试使用OpenAPI 生成器根据openapi: "3.0.2"json 配置自动生成 C# 客户端代码:
openapi-generator generate -i https://test.com/docs/swagger/openapi.json -g csharp-netcore -c open-api-config.json -o DataLakeOpenApiRestClient.cs
Run Code Online (Sandbox Code Playgroud)
此操作失败并出现以下错误:
[主要] 错误 io.swagger.v3.parser.util.RemoteUrl - 无法读取 java.net.ConnectException:连接超时:在 java.net.DualStackPlainSocketImpl.socketConnect 处连接 java.net.DualStackPlainSocketImpl.connect0(本机方法) (未知来源) 在 java.net.AbstractPlainSocketImpl.doConnect(未知来源) 在 java.net.AbstractPlainSocketImpl.connectToAddress(未知来源) 在 java.net.AbstractPlainSocketImpl.connect(未知来源) 在 java.net.PlainSocketImpl.connect(未知来源)源)在 java.net.SocksSocketImpl.connect(未知源) 在 java.net.Socket.connect(未知源) 在 sun.security.ssl.SSLSocketImpl.connect(未知源) 在 sun.security.ssl.BaseSSLSocketImpl.connect (未知来源) 在sun.net.NetworkClient.doConnect(未知来源) 在sun.net.www.http.HttpClient.openServer(未知来源) 在sun.net.www.http.HttpClient.openServer(未知来源) 在sun .net.www.protocol.https.HttpsClient.(未知来源) 在sun.net.www.protocol.https.HttpsClient.New(未知来源) 在sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(未知来源) )在sun.net.www.protocol.http.HttpURLConnection.plainConnect0(未知来源)在sun.net.www.protocol.http.HttpURLConnection.plainConnect(未知来源)在sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection。连接(未知来源)在sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(未知来源)在io.swagger.v3.parser.util.RemoteUrl.urlToString(RemoteUrl.java:147)在io.swagger.v3 .parser.OpenAPIV3Parser.readWithInfo(OpenAPIV3Parser.java:123) 在 io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:45) 在 io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16) 在org.openapitools.codegen.config.CodegenConfigurator.toClientOptInput(CodegenConfigurator.java:586) 在 org.openapitools.codegen.cmd.Generate.run(Generate.java:395) 在 org.openapitools.codegen.OpenAPIGenerator.main(OpenAPIGenerator.爪哇:60)
但是,如果我下载 json 文件并使用本地文件输入运行,则它可以正常工作:
openapi-generator generate -i open-api-offline-file.json -g csharp-netcore -c open-api-config.json -o DataLakeOpenApiRestClient.cs
Run Code Online (Sandbox Code Playgroud)
我在没有公司代理的计算机上对此进行了测试,它工作正常,所以我的主要怀疑是代理。
我已经设置 …
我的 openapi 合约中有以下模式定义来表示commission amount。
commissionAmount:
type: number
minimum: -99999.99
maximum: 99999.99
Run Code Online (Sandbox Code Playgroud)
生成的代码:
@Valid
@DecimalMin("-99999.99") @DecimalMax("99999.99")
public BigDecimal getCommissionAmount() {
return commAmt;
}
Run Code Online (Sandbox Code Playgroud)
生成的代码很好并且符合预期。我只是想知道这些-99999.99以及和99999.99的有效值。minimummaximum
提出这个问题的原因是它没有检查小数部分的限制。例如,我期望12345.678is invalid ,12345.67is valid 。但它将两者标记为有效。
I read@Digits用于检查整数和小数部分的位数限制。我如何告诉也openapi-generator-maven-plugin进行注释?Digits
预期生成的代码:
@Valid
@Digits(integer = 5, fraction = 2)
@DecimalMin("-99999.99") @DecimalMax("99999.99")
public BigDecimal getCommissionAmount() {
return commAmt;
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用supabase/postgres(t) 的rest api,它生成它自己的OpenAPI/Swagger 定义。问题是这仅包含 id 字段,但不包含对其他表的实际引用。
因此,当使用 openapi-generator 生成客户端时,类仅包含外键,而不包含实际的对象引用。
有没有办法生成带有引用的 openapi 定义,以便我可以带有引用生成我的类?
{
"swagger": "2.0",
"info": {
"description": "standard public schema",
"title": "PostgREST API",
"version": "9.0.0.20220211 (pre-release) (dcf7ade)"
},
"host": "localhost:3000",
"basePath": "/",
"schemes": [
"http"
],
"consumes": [
"application/json",
"application/vnd.pgrst.object+json",
"text/csv"
],
"produces": [
"application/json",
"application/vnd.pgrst.object+json",
"text/csv"
],
"paths": {
"/": {
"get": {
"tags": [
"Introspection"
],
"summary": "OpenAPI description (this document)",
"produces": [
"application/openapi+json",
"application/json"
],
"responses": {
"200": {
"description": "OK"
}
}
}
},
"/hallo": …Run Code Online (Sandbox Code Playgroud) 我想构建一个 Maven 模块,使用 来openapi-generator-maven-plugin从两个 openapi 3 规范生成服务器代码和客户端代码。我希望服务器代码使用 Spring boot,因此我有以下设置:
<generatorName>spring</generatorName>
<library>spring-boot</library>
Run Code Online (Sandbox Code Playgroud)
这工作正常,我需要io.swagger.core.v3:swagger-annotationsOAS jakarta.validation:jakarta.validation-api3 注释和验证。
但是,对于客户端代码,我想使用WebClientSpring,我能找到的唯一设置是:
<generatorName>java</generatorName>
<library>webclient</library>
Run Code Online (Sandbox Code Playgroud)
客户端代码生成,但问题是,它需要较旧的io.swagger:swagger-annotations和javax.validation:validation-api.
我想避免拥有不同的库集。是否有使用同一组注释和验证库的服务器和客户端代码生成设置?最好同时使用io.swagger.core.v3:swagger-annotations和jakarta.validation:jakarta.validation-api。
java ×5
openapi ×5
swagger ×4
spring ×3
c# ×1
codegen ×1
jackson ×1
nullable ×1
postgresql ×1
postgrest ×1
proxy ×1
spring-boot ×1
supabase ×1
typescript ×1