SpringBoot2添加Converter后Swagger OpenAPI 3无法显示求助
问题根源与解决方案
我一眼就看出问题出在你继承了WebMvcConfigurationSupport这个类上——在Spring Boot里,一旦你继承这个类,就会完全覆盖Spring MVC的自动配置,包括springdoc-openapi-ui用来映射Swagger UI静态资源的配置,这就导致Swagger UI的页面资源找不到,自然访问不了。
下面给你两种靠谱的解决办法,优先选第二种:
方法一:改用实现WebMvcConfigurer接口(推荐)
Spring Boot官方更推荐通过实现WebMvcConfigurer来扩展MVC配置,这种方式不会破坏原有自动配置,完美兼容Swagger的配置。修改你的配置类:
@Configuration public class StrubConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { // 在这里添加你的转换器 registry.addConverter(new TempReadingSourceConverter()); } }
这样既保留了枚举转换器的功能,又让Swagger UI的自动配置正常生效,重启应用后就能访问Swagger UI了。
方法二:手动添加Swagger UI静态资源映射(如果一定要继承WebMvcConfigurationSupport)
如果你因为某些原因必须继承WebMvcConfigurationSupport,那就要手动把Swagger UI的静态资源路径加进去,修改你的配置类:
@Configuration public class StrubConfig extends WebMvcConfigurationSupport { @Override public FormattingConversionService mvcConversionService() { FormattingConversionService f = super.mvcConversionService(); f.addConverter(new TempReadingSourceConverter()); return f; } // 手动添加Swagger UI静态资源映射 @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/swagger-ui/**") .addResourceLocations("classpath:/META-INF/resources/webjars/springdoc-openapi-ui/"); super.addResourceHandlers(registry); } }
不过还是更推荐第一种方法,毕竟Spring Boot的自动配置能省不少事。
额外优化建议
- 清理依赖冲突:你的pom里同时引入了Swagger 1.5和Swagger 3的注解包,这很容易引发注解冲突,建议删掉
io.swagger:swagger-annotations:1.5.23,只保留Swagger 3的依赖,因为springdoc-openapi是基于OpenAPI 3规范的。 - 增强枚举的Swagger文档:给你的枚举加上Swagger 3的
@Schema注解,这样在Swagger UI里能直接看到枚举的可选值和描述,更友好:
import io.swagger.v3.oas.annotations.media.Schema; @Schema(description = "温度读取来源的枚举类型") public enum TempReadingSource { @Schema(description = "冷室采集") COLDROOM("coldroom"), @Schema(description = "本地采集") LOCAL("local"), @Schema(description = "烤箱采集") OVEN("oven"); private String value; TempReadingSource(String value) { this.value = value; } @Override @JsonValue public String toString() { return String.valueOf(value); } @JsonCreator public static TempReadingSource fromValue(String text) { for (TempReadingSource b : TempReadingSource.values()) { if (String.valueOf(b.value).equals(text)) { return b; } } return null; } }
内容的提问来源于stack exchange,提问作者Stéphane GRILLON
相关产品推荐
相关产品推荐

