我在一个项目中使用 swagger-codegen ,最后我问自己一个问题:swagger 文件的位置是否有任何约定?
这是我的情况:
我在我的项目中使用 Maven,所以我有标准的 Maven 结构:
pom.xml
src
|--main
|--java
|--resources
|--webapp
|--test
|--java
|--resources
Run Code Online (Sandbox Code Playgroud)
为了使用 Swagger 生成我的 REST API,我必须将 swagger.json、一些 mustache 模板和 .swagger-codegen-ignore 放在某处。我已经把它们(自然地?)放在 src/main/resources 中:
resources
|--api
|--v2
|--swagger.json
|--swaggerconfig
|--api.mustache
|--[...]
|--.swagger-codegen-ignore
Run Code Online (Sandbox Code Playgroud)
我已经使用适当的 swagger-codegen-maven-plugin 配置了我的 pom.xml 并将打包设置为 war,以便生成我的战争(以便将其部署在 Tomcat 中)。摘录:
[...]
<packaging>war</packaging>
[...]
<build>
<finalName>my-project</finalName>
<plugins>
<plugin>
<groupId>io.swagger</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${basedir}/src/main/resources/api/v2/swagger.json</inputSpec>
<language>jaxrs</language>
<templateDirectory>${basedir}/src/main/resources/swaggerconfig</templateDirectory>
<addCompileSourceRoot>true</addCompileSourceRoot>
<configOptions>
<library>jersey2</library>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
<!-- .swagger-codegen-ignore must be located at …Run Code Online (Sandbox Code Playgroud) 问题:当我们的 REST 服务返回带有日期/日期时间字段的对象时,这些字段被编码为 JSON 格式的复杂结构:
...
"createdTimestamp": {
"offset": {
"totalSeconds": 0,
"id": "Z",
"rules": {
"fixedOffset": true,
"transitionRules": [],
"transitions": []
}
},
"nano": 257353000,
"hour": 16,
"minute": 5,
"second": 25,
"month": "OCTOBER",
"year": 2017,
"dayOfMonth": 5,
"dayOfWeek": "THURSDAY",
"dayOfYear": 278,
"monthValue": 10
},
...
Run Code Online (Sandbox Code Playgroud)
我希望这些时态数据类型以“2017-10-05T16:05:25”等简单格式序列化为字符串。
该项目最初基于 Java 7 API 并java.util.Date在任何地方使用 - 并且有效。当我切换到 Java 8 并开始使用新java.time类时,除了将日期/时间对象序列化为 JSON 之外,一切正常。
我知道我可以java.util.Date再次使用该类型,但我更喜欢使用新的数据类型。
REST 服务使用 Swagger 定义并使用 Maven 构建。在swagger-codegen-maven-plugin使用时,具有以下配置:
jaxrs-cxf-cdijava8以下是其他相关库的版本(在 …
我正在使用 swagger-codegen-maven-plugin (2.2.1) 从 YML 配置生成 java 和 typescript 代码类文件。我有两个问题。
如何在 YML 中定义枚举属性数组?
如何在 YML 中将地图属性枚举定义为键,将布尔值定义为值?
让我知道这可能还是有任何解决方法?目前,我在 java 和 typescrtipt 中定义了枚举类并将其作为字符串传递。谢谢。
DataInfo:
type: object
properties:
enumTest: -- works fine
type: string
enum:
- one
- two
enumTestArray: --failing to generate code
type: array
items:
type: string
enum:
- one
-two
testMap: -- works fines generate Map<String, Boolean> and { [key: string]: boolean; };
type: object
additionalProperties:
type: boolean
Run Code Online (Sandbox Code Playgroud)
更新:
与第一个问题相关:定义枚举属性数组。swagger-codegen-maven-plugin 生成无效的 java 类文件,如下所示: 生成 <、> 和 " 字符的外观和问题。 …
我正在使用 swagger 指定我的 API 我使用的是 2.0 现在有新版本 3.0.0 根据我使用离线 swagger 编辑器指定 3.0.0 规范的文档。准备好后,我下载了 json 文件,我将使用该文件生成 spring 服务器代码。我下载了swagger-codegen
使用构建它mvn clean package然后我执行了以下命令:
java -jar <PARENT_DIR>/swagger-codegen/modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate -i <PARENT_DIR>/ServerCode/swagger.json -l spring -o <PARENT_DIR>/ServerCode
Run Code Online (Sandbox Code Playgroud)
上面的命令给了我以下错误:
[main] INFO io.swagger.parser.Swagger20Parser - reading from swagger.json
[main] INFO io.swagger.parser.Swagger20Parser - reading from swagger.json
[main] INFO io.swagger.codegen.ignore.CodegenIgnoreProcessor - No .swagger-codegen-ignore file found.
Exception in thread "main" java.lang.RuntimeException: missing swagger input or config!
at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:723)
at io.swagger.codegen.cmd.Generate.run(Generate.java:285)
at io.swagger.codegen.SwaggerCodegen.main(SwaggerCodegen.java:35)
Run Code Online (Sandbox Code Playgroud)
更新 :
我的 swagger.json 文件如下(这是我的试验项目,因此我在这里粘贴了我的 api 结构):
{ …Run Code Online (Sandbox Code Playgroud) 我有一个 gradle 支持的SpringBoot应用程序,我们最初只是在其中创建我们的
REST 控制器,然后使用@EnableSwagger2注释来创建我们的 swagger UI。这工作得很好,但现在我们想过渡到 API 优先的方法。
所以这意味着我们现在正在创建我们的swagger.json第一个,然后swagger-codegen用于生成我们的 Java 接口/控制器以在我们的 SpringBoot 应用程序中使用。我现在正试图弄清楚如何只告诉springfox-swagger-ui使用swagger.json我们创建的,而不是查看 Java 代码以在事后生成 UI。在我看来,这是正确的方法,以避免从本质上springfox-swagger-ui重新生成swagger.json幕后可能引起的任何不一致。
我该如何配置这种行为?谢谢。
我在使用 gradle 插件部署/发布 .jar 生成的 jar 时遇到了一些问题swagger-codegen plugin。
我已经看过这个问题,我的需求完全不同,但它的行为是这样的。它正在部署spring-boot应用程序生成的 jar而不是代码生成器。
这是我生成源文件夹的任务:
import io.swagger.codegen.config.CodegenConfigurator
import io.swagger.codegen.DefaultGenerator
def swaggerSourceFile = "${project.rootDir}/build/generated/swagger-json/swagger.json"
def swaggerTargetFolder = 'build/generated/java/src/main/java'
task generateApi {
inputs.file("$swaggerSourceFile")
outputs.dir("$projectDir/$swaggerTargetFolder")
doLast {
def config = new CodegenConfigurator()
config.setInputSpec("$swaggerSourceFile")
config.setOutputDir("$projectDir/$swaggerTargetFolder")
config.setLang('java')
config.setAdditionalProperties([
'apiPackage' : 'com.xyz.abc.testmanager.controller',
'modelPackage' : 'com.xyz.abc.testmanager.model',
'sourceFolder' : swaggerTargetFolder,
'groupId' : 'com.xyz.abc',
"artifactId" : 'testmanager',
'pom.version' : '1.0.' + System.getenv('BUILD_NUMBER')
])
new DefaultGenerator().opts(config.toClientOptInput()).generate()
}
}
clean.doFirst {
delete(swaggerTargetFolder)
}
configurations {
generatedCompile
}
sourceSets { …Run Code Online (Sandbox Code Playgroud) 我正在使用swagger codegen(在这个Zoura swagger上)来创建一个Java/rest模板客户端.我正在使用swagger Gradle插件:
id "org.hidetake.swagger.generator" version "2.11.0"
Run Code Online (Sandbox Code Playgroud)
这是它的配置:
{
"library": "resttemplate",
"dateLibrary": "java8",
"hideGenerationTimestamp": true,
"modelPackage": "zuora.model",
"apiPackage": "zuora.api",
"invokerPackage": "zuora",
"clientPackage" : "zuora.client"
}
Run Code Online (Sandbox Code Playgroud)
客户端确实生成了,但即使有许多可选字段,它们也不会被创建,并且一切都是必需的.我错过了什么吗?
我们在使用 OpenAPI 2.0 鉴别器时遇到了麻烦,让 Swagger 工具和 Jackson 序列化器都满意。
问题:在序列化期间,Jackson 当前为鉴别器生成两个 JSON 属性,其中之一具有null值。
OpenAPI 2.0 定义
swagger: '2.0'
info:
version: v1
title: Error API
paths:
/errors:
get:
description: Stack Overflow test
responses:
'200':
description: OK
schema:
$ref: '#/definitions/SpecificError'
definitions:
GeneralError:
description: Error Base Structure
type: object
discriminator: errorType
properties:
errorType:
type: string
message:
type: string
required:
- errorType
SpecificError:
description: Test
allOf:
- $ref: "#/definitions/GeneralError"
Run Code Online (Sandbox Code Playgroud)
AFAIU 鉴别器被正确定义。规范要求它同时列在properties和required列表中。
使用的属性名称必须在此模式中定义,并且必须在所需的属性列表中。使用时,该值必须是该模式或继承它的任何模式的名称。
Swagger 代码生成器
Swagger Java 代码生成器生成的是: …
我是 swagger 的新手,我一直在尝试使用 swagger-editor 开发 api。
Swagger-codegen 表示这是一个开源代码生成器,可以直接从 Swagger 定义的 RESTful API 构建服务器存根和客户端 SDK。
当我使用 swagger-editor 时,我可以看到选项:生成服务器和生成客户端(我在本地运行 swagger-editor)
swagger-codegen 是否具有与 swagger-editor 中的 Generate server 和 Generate Client 相同的功能,或者还有其他功能吗?
提前致谢。
Swagger 代码生成工具是否可以选择生成的类是否应将 Lists、Maps 等默认为 null 或为空?
以前,默认值为空,例如private List<String> names = new List<String>。
目前默认为空,即 private List<String> names = null
更改是在 2017 年 4 月完成的,根据我对所做更改的理解,没有选择使用哪个选项,从那时起它总是默认为 null。
讨论包含了为什么这更好的原因,我不反对。但是我有一个遗留应用程序,它使用了某种形式的(Swagger)生成的源代码,几乎没有修改,我试图摆脱这些,只使用 swagger 生成的模型。问题是代码最初是以没有空值的方式编写的,因此不进行空检查。
那么可以做什么呢?使用以前版本的 Swagger 代码生成器?
API 不在我的控制范围内,因此 yaml 修改不是一个选项(如果这甚至可以提供帮助)。
swagger-codegen ×10
swagger ×7
java ×3
openapi ×2
api ×1
gradle ×1
jackson ×1
java-8 ×1
json ×1
maven ×1
maven-plugin ×1
rest ×1
resttemplate ×1
spring ×1
spring-boot ×1
springfox ×1
swagger-2.0 ×1
swagger-ui ×1
yaml ×1
zuora ×1