使用 openapi-generator 使用 openapi v3.0 规范生成 C# API 客户端。有没有办法自定义API的methodNames?我希望能够通过使用 operationId 字段来指定它们?
现在,他们正在将路径变量与 HTTP VERB 和静态路径组件合并在一起。它会起作用,但我希望名称有点不同。
GetEncountersResponse ClientidEncountersDateGet (string clientid, string date, string startToken = null);
Run Code Online (Sandbox Code Playgroud)
另一个选择是只添加新方法,因为该类被定义为部分类?
我有一个 Maven 项目,其中的 API 定义使用 OpenaAPI v3 规范。
我使用 openapi-generator-maven-plugin 生成代码,一切正常。我还可以访问 swagger-ui 并查看和测试我的 API。
问题是我不想两次维护版本号。因此,我想在 api 规范中引用我的 maven pom 中的版本号,而不是冒着过时风险进行复制。
我尝试过maven资源过滤,这似乎有效。由于当我将版本字段放入规范中时,目标文件夹中的 yaml 文件会被很好地替换${project.version},但是当我打开 swagger-ui 时,它会按字面意思打印“${project.version}”而不是实际版本。
这是我的 pom 中的插件配置:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>${openapi-generator-maven-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${project.build.resources[0].directory}/spec.yml</inputSpec>
<ignoreFileOverride>${project.build.resources[0].directory}/.openapi-codegen-ignore</ignoreFileOverride>
<language>spring</language>
<library>spring-boot</library>
<configOptions>
<!-- Use the newer java.time package instead of outdated java.util-->
<dateLibrary>java8</dateLibrary>
</configOptions>
<apiPackage>${default.package}.api</apiPackage>
<modelPackage>${default.package}.model</modelPackage>
<invokerPackage>${default.package}.invoker</invokerPackage>
<generateApiTests>false</generateApiTests>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
这是我的spec.yml:
openapi: 3.0.0
info: …Run Code Online (Sandbox Code Playgroud) 我正在使用OpenApi v3.3.4(以前称为Swagger CodeGen)maven 插件通过文件生成我的其余控制器api.yml,其中我描述了我想要公开的所有操作。
在我的用例中,我想公开一个方法POST: handleNotification(@RequestBody SignatureNotification notification),其请求正文的类型是通过/targer文件夹中的另一个 maven-plugin 生成的。
实际上我SignatureNotification在Components.yml 文件的一部分中定义:
...
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SignatureNotification'
...
Run Code Online (Sandbox Code Playgroud)
它由 OpenApi 插件生成,然后我将其映射到SignatureNotification已经存在且具有相同属性的插件。
我对这个解决方案不太满意,所以我想知道是否有办法告诉 OpenApi Generator 使用外部对象作为引用?
我有以下结构
Notification
|
------------------------
| |
SmsNotification EmailNotification
Run Code Online (Sandbox Code Playgroud)
包含一个包含 或的Notification枚举。现在我有一个类,其中包含一个.notificationTypeSMSEMAILInboxNotification
这是在 swagger yml 中指定的(删除了一些不相关的代码)
definitions:
Notification:
type: "object"
discriminator: "notificationType"
properties:
notificationType:
type: "string"
description: "Type of notification"
enum:
- "EMAIL"
- "SMS"
SmsNotification:
allOf:
- $ref: "#/definitions/Notification"
- type: "object"
EmailNotification
allOf:
- $ref: "#/definitions/Notification"
- type: "object"
Inbox:
type: "object"
properties:
notification:
description: "Latest received notification"
$ref: "#/definitions/Notification"
Run Code Online (Sandbox Code Playgroud)
swagger-codegen v2我使用以下配置生成代码(也尝试过 v3 和 openapi-generator):
<build>
<plugins>
<plugin>
<groupId>io.swagger</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>2.3.1</version>
<executions> …Run Code Online (Sandbox Code Playgroud) 我可以通过源集成功地将生成的 openapi 客户端添加到我的项目中。但是然后我必须将依赖项复制到主项目中build-gradle,解决冲突 - >我认为将客户端作为一个拥有自己的子项目将是一个更好的设计build.gradle。
所以我添加include = 'build:openapi-java-client'了我的settings.gradle和compile project(':build:openapi-java-client')我的依赖项。这样我就有了以下文件
build.gradle::
plugins {
id 'java'
id 'application'
id "org.openapi.generator" version "4.3.1"
}
repositories {
jcenter()
}
openApiGenerate {
generatorName = "java"
inputSpec = "$rootDir/specs/petstore.yaml".toString()
outputDir = "$buildDir/openapi-java-client".toString()
apiPackage = "org.openapi.example.api"
invokerPackage = "org.openapi.example.invoker"
modelPackage = "org.openapi.example.model"
configOptions = [
dateLibrary: "java8"
]
}
dependencies {
implementation 'com.google.guava:guava:29.0-jre'
testImplementation 'junit:junit:4.13'
compile project(':build:openapi-java-client')
}
application {
mainClassName = 'a.aa.App'
} …Run Code Online (Sandbox Code Playgroud) 我正在使用 openapi-generator 生成 java 类。
我希望模型类实现一个尚未由 openapi-generator 生成的外部接口。
是否可以在模型 yaml 中定义某些内容,或者可以传递给 openapi-generator-maven-plugin 的属性来实现此行为?
所需行为的示例:
package com.example.model;
/**
* ExampleModel
*/
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen")
public class ExampleModel implements com.example.CustomInterface {
@JsonProperty("property1")
private String property1;
@JsonProperty("property2")
private String property2;
Run Code Online (Sandbox Code Playgroud) 我正在使用 OpenAPI 生成器从 OAI 规范开始生成 spring-boot 的服务器端实现。
我注意到,在我使用的配置中,生成器没有在控制器中使用委托模式。例如,控制器如下所示:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.request.NativeWebRequest;
import java.util.Optional;
@Controller
@RequestMapping("${openapi.someresourceLibrary.base-path:/some-resource/v1}")
public class SomeResourcesApiController implements SomeResourcesApi {
private final NativeWebRequest request;
@org.springframework.beans.factory.annotation.Autowired
public SomeResourcesApiController(NativeWebRequest request) {
this.request = request;
}
@Override
public Optional<NativeWebRequest> getRequest() {
return Optional.ofNullable(request);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以在 pom.xml 文件中将配置设置delegatePattern为true启用委托模式的使用。
我想知道是否有人知道为什么默认情况下该工具不使用对于该用例来说似乎最自然的委托模式。
如果我决定使用默认模式,我应该如何提供我的实现?我应该扩展控制器吗?
我正在使用 OpenAPI Generator 创建客户端,但是当我尝试发出 POST 请求时,LocalDateTime 会被序列化为整数数组,看起来像
{
"startDate": [ 2019, 11, 13, 0, 0 ],
"endDate": [ 2020, 12, 31, 0, 0 ]
}
Run Code Online (Sandbox Code Playgroud)
我正在等待这个结果,像 ISO 字符串一样解析
{
"startDate": "2019-11-13T00:00",
"endDate": "2020-12-31T00:00"
}
Run Code Online (Sandbox Code Playgroud)
我的gradle配置是这样的:
dependencies {
compile 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.3'
classpath 'org.openapitools:openapi-generator-gradle-plugin:4.2.3'
}
task generateClientDS(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask) {
inputSpec = "$rootDir/specifications/client-ds.yaml".toString()
outputDir = "$rootDir".toString()
generatorName = 'java'
library = 'resttemplate'
apiPackage = 'com.example.gen.clients.clientds.api'
modelPackage = 'com.example.gen.clients.clientds.dto'
modelNameSuffix = 'DTO'
configOptions = [
hideGenerationTimestamp: 'true',
dateLibrary: 'java8'
]
typeMappings = [
OffsetDateTime: 'java.time.LocalDateTime' …Run Code Online (Sandbox Code Playgroud) java gradle-plugin openapi swagger-codegen openapi-generator
我正在使用 OpenAPI Generator 为符合 swagger 标准的服务生成 Java 11 HTTP 客户端。
问题是:该服务需要基本身份验证,但它不会使用标头向客户端发起挑战WWW-Authenticate,因此 Java 11 HTTP 客户端不会发送使用构建器配置的基本身份验证。解决方法是Authorization按照此线程中的建议直接在请求中添加标头。
现在:从版本 4.3.1 开始,OpenAPI Generator 不会向我公开自定义 HTTP 请求的接口,所以我想知道是否最好覆盖负责的模板(api.mustache:126)或者是否有这项任务的更清洁的替代方案。
我使用 openApi-generator-maven 插件版本 4.2.3 成功生成了 Rest Api 控制器和模型。在 yaml 合约中,我们引用包含共享模型的外部 YAML 文件:
schema:
$ref : 'mycontract.yaml#/components/schemas/PrjExceptionHandler'
Run Code Online (Sandbox Code Playgroud)
这个共享的yaml位于特定的包下。有没有办法在生成过程中忽略 yaml 文件(此 yaml 中定义的模型)?实际上,我正在使用 .openapi-generator-ignore 文件来一一忽略模型,例如:
**/PrjExceptionHandler*
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个全局解决方案,在该解决方案中,我可以忽略给定 Yaml 文件或要忽略的包的所有模型,此外,通过执行实际的解决方案,我在生成过程中遇到编译错误,其中对象抱怨PrjExceptionHandler不会被忽略定义的。
感谢您的支持。