srpingboot 2.0 整合swagger2出现404 或500 的问题解决方案

版权声明:转载请注明出处。 原文作者:Lily@g 原文链接: https://blog.csdn.net/weixin_42389328/article/details/82620900

我用的是springboot2.0.3 版本

下面看一下具体是怎么解决swagger不能访问的问题的。

在springboot 中WebMvcConfigurerAdapter类废弃不用了,可以通过继承WebMvcConfigurationSupport类代替WebMvcConfigurerAdapter类,也可以通过实现这个WebMvcConfigurer类代替WebMvcConfigurerAdapter。这里我是使用的是这个WebMvcConfigurationSupport类。

一、使用WebMvcConfigurationSupport这个类的时候静态文件会被拦截通过重写addInterceptors这个方法排除swagger的访问路径。如红色部分所示:

  • swagger配置文件

@Configuration
@EnableSwagger2
public class Swagger2  {

    @Bean

    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.manager"))//基础包
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("家庭签约平台API文档")
                .description("简单优雅的restful风格")
                .version("1.0")
                .build();
    }
}

  • 拦截器的实现

@Configuration
public class MyWebConfig extends WebMvcConfigurationSupport {

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/**").excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**","/error/");
}

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (int i = converters.size() - 1; i >= 0; i--) {
            if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter convert = (MappingJackson2HttpMessageConverter) converters.get(i);
                InjectTokenJsonHttpMessageConverter convert2 = new InjectTokenJsonHttpMessageConverter(convert.getObjectMapper());
                converters.set(i, convert2);
            }
        }
        super.extendMessageConverters(converters);
    }
    /**
     * 配置servlet处理
     */
    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
    //配置跨域请求,允许所有站点访问
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowCredentials(true)
                .allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS")
                .maxAge(3600);
    }
}

整了好长时间,一直报404 或500 是没有配置,这个配置完以后就可以正常访问了。

/** * 配置servlet处理 */

@Override

public void configureDefaultServletHandling( DefaultServletHandlerConfigurer configurer) {

configurer.enable();

}

访问地址:localhost:8080/swagger-ui.html 我这里配置的8082端口

二、如果是通过实现WebMvcConfigurer这个类来代替WebMvcConfigurerAdapter这个类的话。可以通过下面的方法解决swagger访问失败的问题。

@Configuration
@EnableSwagger2
public class Swagger2 implements WebMvcConfigurer {

    @Bean

    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("cn.qzzg"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("家庭签约平台API文档")
                .description("简单优雅的restful风格")
                .version("1.0")
                .build();
    }
    @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/");

    }

}

通过重写addResourceHandlers这个方法,把swagger文件添加为静态资源。

拦截器的实现那边只需要重写configureDefaultServletHandling这个方法,不需要在addInterceptors这个方法中排除路径了。

@Configuration
public class MyWebConfig extends WebMvcConfigurationSupport {

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/**");
}

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (int i = converters.size() - 1; i >= 0; i--) {
            if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter convert = (MappingJackson2HttpMessageConverter) converters.get(i);
                InjectTokenJsonHttpMessageConverter convert2 = new InjectTokenJsonHttpMessageConverter(convert.getObjectMapper());
                converters.set(i, convert2);
            }
        }
        super.extendMessageConverters(converters);
    }


    /**
     * 配置servlet处理
     */
    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
    //配置跨域请求,允许所有站点访问
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowCredentials(true)
                .allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS")
                .maxAge(3600);
    }
}

以上两种方法都可以解决swagger访问失败的问题。

自己爬过的坑,分享一下。有不对的地方,请多指教

猜你喜欢

转载自blog.csdn.net/weixin_42389328/article/details/82620900
今日推荐