srpingboot 2.0 整合swagger出現404 或500 的問題解決方案
我用的是springboot2.0.3 版本
下面看一下具體是怎麼解決swagger不能訪問的問題的。
在springboot 中WebMvcConfigurerAdapter類廢棄不用了,可以通過繼承WebMvcConfigurationSupport類代替WebMvcConfigurerAdapter類,也可以通過實現這個WebMvcConfigurer類代替WebMvcConfigurerAdapter。這裡我是使用的是這個WebMvcConfigurationSupport類。
一、使用WebMvcConfigurationSupport這個類的時候靜態檔案會被攔截通過重寫addInterceptors
- 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訪問失敗的問題。
自己爬過的坑,分享一下。有不對的地方,請多指教