spring boot swagger-ui.html 404

很奇怪的问题,找了好久。

因为spring boot+swagger实现起来很简单。看下面三部曲:

1.pom添加两个swagger依赖.

  


		
			io.springfox
			springfox-swagger2
			2.8.0
		
		
			io.springfox
			springfox-swagger-ui
			2.8.0
		
		


2.添加SwaggerAutoConfiguration.

@Configuration
@EnableSwagger2
public class SwaggerAutoConfiguration{

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("")
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.....web"))
                .paths(PathSelectors.any())
                .build();
    }


    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("**平台对外接口")
                .description("1.提供**后台使用的接口 2.提供对其他服务调用的服务")
                .contact(new Contact("xtj332", "https://blog.csdn.net/xtj332", "[email protected]"))
                .version("1.0")
                .build();
    }


}

3.浏览器访问 http://127.0.0.1:8080/swagger-ui.html

spring boot swagger-ui.html 404_第1张图片


但是!竟然返回大大的404!!!


spring boot swagger-ui.html 404_第2张图片


排查过程:

从spring boot官网生成一个简单的spring-boot-web项目,进行上面三步,不会出现问题。

猜测是自己添加或更改了什么webmvc之类的东西,比如引入jar包,添加config。

最后发现同事写了一个跨域的东西:

@Configuration
public class WebApiConfig extends WebMvcConfigurationSupport {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH")
                .allowCredentials(true).maxAge(3600);
    }

把这个configuration注释掉就可以了。

原因:

这个自定义的类继承自WebMvcConfigurationSupport,如果你在IDE中搜索这个类的实现类,可以发现spring boot有一个子类EnableWebMvcConfiguration,并且是自动config的.我们知道,如果一个类用户自己在容器中生成了bean,spring boot就不会帮你自动config。所以,问题的原因是我们把spring boot自定义的那个bean覆盖了。

那么我想既然使用跨域又使用swagger该怎么办呢?只需加上下面的代码。

@Configuration
public class WebApiConfig extends WebMvcConfigurationSupport {


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
        super.addResourceHandlers(registry);
    }
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH")
                .allowCredentials(true).maxAge(3600);
    }

延展:

才开始接触spring boot,感觉是简化了spring的一些配置,并且帮开发者管理jar包版本。慢慢觉得更强大好用的地方是starter帮你自动生成bean,方便开发者。但是这也带来了一些恶果,强大的封装造成有些问题不好排查,想做一些改动引起很大的问题。


你可能感兴趣的:(spring,boot)