更新:
如下文所述,一位同事回答了我的问题。我把它放在这儿,以防对别人有帮助。
答案是:
只需将@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;
此枚举类型具有索引(nano、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字段的问题-如果我们使用索引(即秒、小时等)或从请求中删除该字段,我们将收到有效的响应。
我的问题是,我们如何让springfox打印索引而不是swagger文档中的“name”,或者我们可以使它使应用程序识别枚举类型的“name”?
请注意,我们的springfox摘要定义如下:
@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)
;
}
1条答案
按热度按时间mv1qrgav1#
一位同事提供的答案,所以我会把它放在这里。只需将@apimodelproperty注解添加到chronounit字段,如下所示:
甚至不需要将@apimodel注解添加到它所在的类中,因为该类中的其他所有内容都将保留默认值。