springfox swagger-使用索引显示chronounit枚举值

kulphzqa  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(457)

更新:
如下文所述,一位同事回答了我的问题。我把它放在这儿,以防对别人有帮助。
答案是:
只需将@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)
        ;
    }
mv1qrgav

mv1qrgav1#

一位同事提供的答案,所以我会把它放在这里。只需将@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注解添加到它所在的类中,因为该类中的其他所有内容都将保留默认值。

相关问题