当前位置 博文首页 > Lily所能及:srpingboot 2.0 整合swagger2出现404 或500 的问题

    Lily所能及:srpingboot 2.0 整合swagger2出现404 或500 的问题

    作者:[db:作者] 时间:2021-06-13 18:34

    版权声明:转载请注明出处。 原文作者: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访问失败的问题。

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

    ?

    ?