You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的自动配置能省不少事。

额外优化建议

  1. 清理依赖冲突:你的pom里同时引入了Swagger 1.5和Swagger 3的注解包,这很容易引发注解冲突,建议删掉io.swagger:swagger-annotations:1.5.23,只保留Swagger 3的依赖,因为springdoc-openapi是基于OpenAPI 3规范的。
  2. 增强枚举的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:13:37