提问人:Manny 提问时间:10/14/2023 最后编辑:Manny 更新时间:10/23/2023 访问量:214
openApi 生成器 spring 模板省略属性的默认值
openApi generator spring template omits default values of properties
问:
我在下面附上一个基本架构。使用 editor.swagger.io 时,在展开架构详细信息时,我能够在生成的页面中查看我的属性的默认值。OAS 3.0
openapi: 3.0.3
info:
title: API Specification
version: 1.0.0
servers:
- url: https://localhost
paths:
/operation:
post:
operationId: run
requestBody:
description: Description
content:
application/json:
schema:
$ref: '#/components/schemas/Request'
required: true
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/Response'
'400':
description: Bad request
'500':
description: Internal Server Error
components:
schemas:
Request:
type: object
properties:
x:
type: number
example: 0
default: 2
Response:
type: object
properties:
id:
type: integer
但是,当从编辑器的顶部菜单使用引擎生成服务器存根时,我注意到注释的属性没有填充。spring
defaultValue
@Schema
// ...
@JsonProperty("x")
private BigDecimal x = new BigDecimal(2);
// ...
/**
* Get x
* @return x
**/
@Schema(example = "0", description = "")
@Valid
public BigDecimal getX() {
return x;
}
如您所见,生成的服务器类正确地实例化了默认变量。
这确实是我缺少的注释的属性。我已经看到此属性包含在 OAS 的对象中。
我想在上面的注释中看到的是如下的附加属性:defaultValue
@Schema
@Parameter
@Schema(example = "0", description = "", defaultValue="2")
这是弹簧引擎模板的错误吗?
如果我的问题有一个已知的解决方案,并且维护较少,我想避免立即求助于自定义胡须模板。
答:
1赞
Maksim Eliseev
10/23/2023
#1
关于这个问题的一点调查
实际上,您在生成的源中有 2 个问题:
生成的接口中的注解生成得不太正确:
@Parameter
ResponseEntity<Response> run(@Parameter(in = ParameterIn.DEFAULT, description = "Description", required=true, schema=@Schema()) @Valid @RequestBody Request body);
如您所见,参数设置不正确。
schema
如您所述,生成的类中的注释没有参数:
@Schema
Request
defaultValue
@Schema(example = "0", description = "") @Valid public BigDecimal getX() { return x; }
我尝试了 Gradle 插件(类似于 swagger codegen),结果是一样的:org.openapi.generator
注释中的参数未设置:
schema
@Parameter
default ResponseEntity<Response> run( @Parameter(name = "Request", description = "Description", required = true) @Valid @RequestBody Request request ) { // ... }
相同的行为。
通常,类的代码是正确生成的:字段初始化为默认值。Request
x
public class Request {
@JsonProperty("x")
private BigDecimal x = new BigDecimal(2);
// ...
}
你真的需要适当的注释吗?
评论
0赞
Manny
10/24/2023
感谢您的帮助!如果没有其他答案提供关于如何解决它的其他建议,我会将赏金分配给您!注解对我来说不是一个障碍,但现在我无法通知我的服务的使用者某些参数的默认值,除非我用文本键入它,如果我更改默认值并忘记更新文本,这可能会很快失效。我知道我可以使用示例来代替,但我希望它只适用于我可能缺少的一些配置。
1赞
Maksim Eliseev
10/24/2023
@Manny,当我在一家公司工作时,我们向 API 使用者提供生成的客户端。为此,我们使用了 swagger-codegen。客户端和服务器是从文本(来自开放 API 规范)生成的,即这是“文本优先”的方法。如果您使用“文本优先”方法,我认为这是有道理的。这将迫使您记住更新文本并始终保持最新状态。
1赞
Maksim Eliseev
10/24/2023
@Manny,有两个工具:openapi-generator 和 swagger-codegen 都有 Maven 或 Gradle 插件,用于基于 OAS 文件的生成服务器和客户端。
1赞
Manny
10/24/2023
在这种情况下,我可能会尝试 swagger-codegen,感谢您的替代选择!维护越少越好!
上一个:使用函数中的默认值向表添加列
下一个:DJANGO 模型表单初始值
评论
springdoc-openapi