【问题标题】:Springfox Swagger - Display ChronoUnit enum values using IndicesSpringfox Swagger - 使用索引显示 ChronoUnit 枚举值
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-10-03
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多