版权声明:转载请注明出处。 原文作者: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的访问路径。如红色部分所示:
@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> 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> 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访问失败的问题。
自己爬过的坑,分享一下。有不对的地方,请多指教