srpingboot 2.0 整合swagger2出現404 或500 的問題解決方案
版權宣告:轉載請註明出處。 原文作者:[email protected] 原文連結: 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訪問失敗的問題。
自己爬過的坑,分享一下。有不對的地方,請多指教