【发布时间】:2021-05-28 21:10:36
【问题描述】:
更新:
如下所述,一位同事能够回答我的问题。我会把它留在这里,以防它对其他人有帮助。
答案:
只需将@ApiModelProperty 注释添加到 ChronoUnit 字段,如下所示:
@ApiModelProperty(dataType = "string", allowableValues = "NANOS, MICROS, MILLIS, SECONDS, MINUTES, HOURS, HALF_DAYS, DAYS, WEEKS, MONTHS, YEARS, DECADES, CENTURIES, MILLENNIA,ERAS, FOREVER")
private ChronoUnit durationType;
甚至不需要给它的类添加@ApiModel注解 存在于,因为类中的所有其他内容都坚持默认值。
======================================
在我团队的项目中,我们有一个带有 java.time.temporal.ChronoUnit 字段的实体。在类中,它是这样定义的:
@NotNull
@Enumerated(EnumType.STRING)
@Column(name="duration_type", nullable = false)
@JsonView({Views.RequestDetailView.class})
private ChronoUnit durationType;
此枚举类型具有索引(NANOS、SECONDS、HOURS 等),以及与这些索引关联的键值对,例如
NANOS("Nanos", Duration.ofNanos(1)),
我们的 springfox 生成的 Swagger 打印名称,而不是索引。换句话说,它打印:
"durationType":{"type":"string","enum":["Nanos","Micros","Millis","Seconds","Minutes","Hours","HalfDays","Days","Weeks","Months","Years","Decades","Centuries","Millennia","Eras","Forever"]}
而不是
"durationType":{"type":"string","enum":["NANOS","MICROS","MILLIS","SECONDS","MINUTES","HOURS","HALF_DAYS","DAYS","WEEKS","MONTHS","YEARS","DECADES","CENTURIES","MILLENNIA","ERAS","FOREVER"]}
这无关紧要,除了自动化测试工具提取这些名称,在请求中发送一个,请求失败,因为它与索引不匹配。
这是它测试的端点的样子:
@ApiResponses(value = ....)
@ApiOperation(value = "Update Container", notes = "Update Container")
@PostMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity updateContainer(@PathVariable("id") id, @RequestBody final Request request){
....
}
方法内的代码无关紧要,因为请求不会到达它,而是以 400 响应弹回。
在这一点上,我确实需要澄清一下,我们绝对已经确定问题出在 ChronoUnit 字段上——如果我们使用索引(即 SECONDS、HOURS 等)或从我们的请求中删除该字段,我们会收到一个有效的响应。
我的问题是,我们如何让 springfox 打印 INDEX 而不是 Swagger 文档中的“名称”,或者我们可以让我们的应用程序识别枚举类型 ChronoUnit 的“名称”吗?
请注意,我们的 springfox Docket 定义如下:
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfoSwagger2())
.select()
.apis(RequestHandlerSelectors.basePackage("....controller"))
.paths(PathSelectors.any())
.build()
.protocols(new HashSet<>(Arrays.asList("https")))
.securitySchemes(getSecuritySchemes())
.securityContexts(getSecurityContexts())
.useDefaultResponseMessages(true)
;
}
【问题讨论】:
标签: java spring swagger swagger-ui springfox