1. 程式人生 > >srpingboot 2.0 整合swagger出現404 或500 的問題解決方案

srpingboot 2.0 整合swagger出現404 或500 的問題解決方案

我用的是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訪問失敗的問題。

自己爬過的坑,分享一下。有不對的地方,請多指教