Spring Boot 中访问 swagger-ui.html(swagger 3) 报 404 错误

访问 http://192.168.0.157:8081/swagger-ui.html 重定向到 swagger-ui/index.html 页面,但是 报404 错误。
404错误
访问 http://192.168.0.157:8081/v3/api-docs 能正确返回数据。 正确返回
代码中发现为了配置静态资源映射继承了 org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

    @Resource
    private AttachmentApiService attachmentApiService;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry){

        //映射本地文件夹
        Path directory = attachmentApiService.getDirectory();

        /*附件资源**/
        registry.addResourceHandler("/attachmentFile/**").addResourceLocations("file:"+directory.toString()+"\\");
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedMethods("*");
    }
}

解决方案:
将上述配置类改为实现 org.springframework.web.servlet.config.annotation.WebMvcConfigurer 接口。
成功返回页面。
成功

@Configuration
public class WebMvcConfig implements WebMvcConfigurer

原因:
swagger 的页面配置类 org.springdoc.webmvc.ui.SwaggerWebMvcConfigurer 就是实现此接口。而当项目中存在 WebMvcConfigurationSupport 类型bean时不会加载这些接口实现类。
参考: org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
		ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration

找问题的过程中还遇到个坑就是项目中竟然还有个配置类继承 WebMvcConfigurationSupport。多浪费了一些时间,还以为不是这个问题导致的。

参考文档1 参考文档2

0评论