代码之家  ›  专栏  ›  技术社区  ›  liangqicai

提供的定义在呈现openapi时未指定有效的版本字段

  •  0
  • liangqicai  · 技术社区  · 2 年前

    我正在将OpenAPI与我的项目集成,当我访问url时: http://127.0.0.1:11014/swagger-ui/index.html ,显示如下错误:

    Unable to render this definition
    The provided definition does not specify a valid version field.
    
    Please indicate a valid Swagger or OpenAPI version field. Supported version fields are swagger: "2.0" and those that match openapi: 3.0.n (for example, openapi: 3.0.0).
    
     
    

    这是OpenAPI配置:

    package misc.config.openapi;
    
    import io.swagger.v3.oas.models.ExternalDocumentation;
    import io.swagger.v3.oas.models.OpenAPI;
    import io.swagger.v3.oas.models.info.Info;
    import io.swagger.v3.oas.models.info.License;
    import org.springdoc.core.GroupedOpenApi;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * https://springdoc.org/
     * https://github.com/springdoc/springdoc-openapi
     */
    @Configuration
    public class OpenApiConfig {
    
        @Bean
        public GroupedOpenApi fortuneApi() {
            GroupedOpenApi.Builder builder = GroupedOpenApi.builder()
                    .pathsToMatch("/fortune/**")
                    .group("dddd");
            GroupedOpenApi groupedOpenApi = builder.build();
            return groupedOpenApi;
        }
    
        @Bean
        public OpenAPI fortuneAPI() {
            return new OpenAPI()
                    .info(new Info().title("Fortune API")
                            .description("Spring shop sample application")
                            .version("v0.0.1")
                            .license(new License().name("Apache 2.0").url("http://springdoc.org")))
                    .externalDocs(new ExternalDocumentation()
                            .description("SpringShop Wiki Documentation")
                            .url("https://springshop.wiki.github.org/docs"));
        }
    
    }
    

    我已经阅读了这个问题 Swagger..Unable to render this definition The provided definition does not specify a valid version field 并尝试了答案,但都不起作用。我应该怎么做才能指定版本?依赖关系如下所示:

        api "org.springdoc:springdoc-openapi-ui:1.6.9"
    

    我做了一个最小的复制,发现正常的响应是json对象,但问题响应返回字符串。这是正确的响应:

    {
        "openapi": "3.0.1",
        "info": {
            "title": "Fortune API",
            "description": "Spring shop sample application",
            "license": {
                "name": "Apache 2.0",
                "url": "http://springdoc.org"
            },
            "version": "v0.0.1"
        },
        "externalDocs": {
            "description": "SpringShop Wiki Documentation",
            "url": "https://springshop.wiki.github.org/docs"
        },
        "servers": [
            {
                "url": "http://127.0.0.1:11018",
                "description": "Generated server url"
            }
        ],
        "paths": {},
        "components": {}
    }
    

    这是我的项目中的问题响应:

    "{\"openapi\":\"3.0.1\",\"info\":{\"title\":\"Fortune API\",\"description\":\"Spri......
    
    0 回复  |  直到 2 年前
        1
  •  12
  •   Dolphin    2 年前

    最后我发现我更改json转换器导致了这个问题,这是一个解决方法:

    @EnableWebMvc
    @Configuration
    public class WebConvertConfig implements WebMvcConfigurer {
    
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
            converters.add(new StringHttpMessageConverter());
        }
    }
    

    StringHttpMessageConverter 应该是第一个添加到转换器中的。我认为这是openapi的设计问题,使其难以使用。更多信息请点击此处:

        2
  •  1
  •   Nothing4ever    1 年前

    我遇到了同样的事情,但原因不同。端点 v3/api-docs 返回base64字符串而不是json。(有点像: eyJvcGVuYXBpIjoiMy4wLjEiLCJpbmZvIjp7InRpdGxlIjoiT3BlbkFQSSBkZWZpbml0aW9uIiwid.. ).

    经过一番搜索,我发现当覆盖注册的默认spring-boot时 HttpMessageConverter ,您也应该注册ByteArrayHttpMessageConverter,以获得正确的springdoc openapi支持。

            converters.add(new ByteArrayHttpMessageConverter());
            converters.add(new MappingJackson2HttpMessageConverter(jacksonBuilder.build()));
    

    笔记 在注册HttpMessageConverters时,顺序非常重要。

    参考文献: