无法呈现此定义提供的定义不 指定一个有效的版本字段。
请指明有效的Swagger或OpenAPI版本字段。支持的 版本字段大张旗鼓:“ 2.0”,那些与openapi匹配的字段:3.0.n (例如,openapi:3.0.0)。
我需要在哪里插入正确的版本来停止以下错误。 Swagger编辑器工作正常,但是在启动特定项目时收到此错误。 非常感谢
答案 0 :(得分:5)
我今天遇到了同样的问题。在我的情况下,导致错误的是Gson
配置。如果您同时将Gson
与SpringMVC
一起使用,可以尝试一下:
我正在使用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-doc
被LoginInterceptor
拦截了,我的解决方法是:
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"); });
下次我遇到这个问题时,至少我不会感到困惑。