Swagger ..无法呈现此定义提供的定义未指定有效的版本字段

时间:2018-08-21 15:05:22

标签: javascript api swagger

  

无法呈现此定义提供的定义不   指定一个有效的版本字段。

     

请指明有效的Swagger或OpenAPI版本字段。支持的   版本字段大张旗鼓:“ 2.0”,那些与openapi匹配的字段:3.0.n   (例如,openapi:3.0.0)。

我需要在哪里插入正确的版本来停止以下错误。 Swagger编辑器工作正常,但是在启动特定项目时收到此错误。 非常感谢

7 个答案:

答案 0 :(得分:5)

我今天遇到了同样的问题。在我的情况下,导致错误的是Gson配置。如果您同时将GsonSpringMVC一起使用,可以尝试一下:

我正在使用spring boot 2.2.4和spring fox swagger 2.9.2设置一个rest-api项目。由于我比Gson更熟悉Jackson,因此我替换了默认的MessageConverter:

@Configuration
@EnableWebMvc
public class MvcConfiguration implements WebMvcConfigurer {

    private final Gson gson = new Gson();

    // ......

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter();
        gsonHttpMessageConverter.setGson(gson);
        converters.add(gsonHttpMessageConverter);
    }

    // ......

}

此后,“ http://localhost:8080/swagger-ui.html”的中断类似于所描述的问题。 然后,我在浏览器中输入“ http://localhost:8080/v2/api-docs”,并注意到swagger文档被包装到了另一层,其中包含一个不必要的“ value”字段,如下所示:

{
    value: "{"swagger":"2.0","info":{"description": ......}}"
}

毫无疑问,如果api-docs产生类似的内容,招摇巨人将找不到"swagger":"2.0"字段。 “值”字段的值是实际的草签文档。

经过一番搜索,我发现如果您不做任何修改,那么Gson会错误地将swagger文档序列化。解决方案很简单-向您的Gson bean注册一个用于摇摇欲坠的序列化器:

private final Gson gson = new GsonBuilder()
        .registerTypeAdapter(Json.class, new SpringfoxJsonToGsonAdapter())
        .create();

private static class SpringfoxJsonToGsonAdapter implements JsonSerializer<Json> {
    @Override
    public JsonElement serialize(Json json, Type type, JsonSerializationContext context) {
        final JsonParser parser = new JsonParser();
        return parser.parse(json.value());
    }
}

其中Json是springfox提供的类:

import springfox.documentation.spring.web.json.Json;

希望这会有所帮助。

答案 1 :(得分:3)

您的API definition缺少OpenAPI / Swagger版本号,在这种情况下为"swagger": "2.0"。像这样添加它的开头:

{
    "swagger": "2.0",

    "title" : "Music API Documentation",
    ...

答案 2 :(得分:3)

就我而言,我使用的是

const openapiSpecification = swaggerJsdoc(options);

当我实际上needed

const openapiSpecification = await swaggerJsdoc(options);

答案 3 :(得分:0)

这是适用于我的OpenAPI V3的此问题的解决方案。 我认为这也可能与其他版本有关。

我尝试使用Gson而不是Jackson作为Spring的默认序列化程序。 Gson生成的/ v3 / api-docs用双引号引起来。 因此,/swagger-ui/index.html显示了此线程中解决的错误。

回到杰克逊为我解决了这个问题。 如果您必须使用Gson,也许上面写的@Lyux解决方案很适合您。

答案 4 :(得分:0)

我也遇到了这个问题,在我的情况下,/v3/api-docLoginInterceptor拦截了,我的解决方法是:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        if (request.getRequestURI().startsWith("/swagger") || "/v3/api-docs".equals(request.getRequestURI())) {
            return true;
        }

}

答案 5 :(得分:0)

遇到类似情况,在pom上使用的swagger库是

 <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
     </dependency>
     <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
     </dependency>  

Application.java上指定Docket Bean

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.context.annotation.Bean;

import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * Created by nyakundid
 */
@EnableScheduling
@EnableAsync
@SpringBootApplication
@EnableSwagger2
public class Application implements CommandLineRunner {

    public Log log = LogFactory.getLog(Application.class);


    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }

    @Bean
    public Docket productApi() {
        return new Docket(DocumentationType.SWAGGER_2).select()
                .apis(RequestHandlerSelectors.basePackage("com.package.controller")).build();
    }
}

最后在 basePackage 下创建您的控制器 希望它对您有用。

答案 6 :(得分:0)

我现在在.net核心项目中遇到过两次。 (随时告诉我去回答我自己的问题)。

Startup.cs的{​​{1}}方法中,我需要验证为UI渲染的json的路径。看起来应该像这样:

app.UseSwaggerUI(c => { c.SwaggerEndpoint("./v1/swagger.json", "MyServiceAPI"); });

下次我遇到这个问题时,至少我不会感到困惑。