【问题标题】:How to set Additional Properties to boolean如何将附加属性设置为布尔值
【发布时间】:2020-10-22 20:08:32
【问题描述】:

我正在尝试将 Additional Properties 元素设置到 Open API Schema 3.X 中,但不幸的是,我无法在文档中找到任何可以帮助我的内容。 我在 Spring Boot 中有一个应用程序,它使用依赖 Swagger OAS 作为传递依赖的 Spring doc OAS。 让我在这里挑选一些代码 sn-p:

@GetMapping("/{accountId}")
@Operation(summary = "Get account by account id", tags = TAG)
@ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "Return a specific account queried by path",
                content = { @Content(mediaType = "application/json",
                        schema = @Schema(implementation = AccountDetailsDTO.class)) }),
        @ApiResponse(responseCode = "404", description = "No accounts found",
                content = @Content) })
public ResponseEntity<AccountDetailsDTO> getAccountDetailsByClientId(@PathVariable("accountId") Integer accountId) { }

此属性默认为 true,我希望看到的是 false,如下所示:

【问题讨论】:

    标签: java spring spring-boot swagger openapi


    【解决方案1】:

    如果您想明确地将属性设置为 false,如果您使用 Springfox,您可以使用 TransformationFilter(注释为 Spring 的 @Component)将您规范的每个组件的附加属性设置为 false。

    如果你使用的是 Springdoc,你可以添加一个 OpenApiCustomiser bean,见例子

    Springdoc OpenAPI 示例

        @Bean
        public OpenApiCustomiser openApiCustomiser() {
            return openApi -> openApi.getComponents().getSchemas().values().forEach( s -> s.setAdditionalProperties(false));
        }
    

    Springfox 框架示例

    @Component
    @Order(Ordered.HIGHEST_PRECEDENCE + 1)
    public class OpenApiTransformationFilter implements WebMvcOpenApiTransformationFilter
    {
        public boolean supports(@NotNull DocumentationType delimiter)
        {
            return SwaggerPluginSupport.pluginDoesApply(delimiter);
        }
    
        @Override
        public OpenAPI transform(OpenApiTransformationContext<HttpServletRequest> context)
        {
            OpenAPI openApi = context.getSpecification();
            openApi.getComponents().getSchemas().values().forEach(schema -> schema.setAdditionalProperties(false));
            return openApi;
        }
    }
    

    【讨论】:

    • 我没有使用 Spring fox,所以让我试着弄清楚 springdoc-openapi 是如何实现它的。谢谢!
    • 哦好吧,那我用springdoc看看
    • @JanR.Krejci 如果我的更新帮助您解决问题,请告诉我。
    【解决方案2】:

    一种解决方法可能是定义一个包含类型信息的虚拟类,然后将其用作@APIResponse 中的@Schema#implementation 类。

    static class YourTypeMap extends java.util.HashMap<String, YourType> {};
    

    然后:

    @APIResponse(
      responseCode = "200",
      content = @Content(
        mediaType = "application/json", 
        schema = @Schema(implementation = YourTypeMap.class)))
    

    致谢MikeEdgar

    【讨论】:

    • 不幸的是,它不适用于我的目的,因为我需要的是作为布尔类型而不是对象包装器的附加属性。 :(
    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2023-03-07
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多