程序中想使用swagger2看看接口是否都正常,但是,输入http://localhost:8080/swagger-ui.html总是提示404。而通过postman来请求,都是可以的,推测swagger配置有问题。
前端页面错误如下(提示找不到页面):
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Thu Jun 20 17:51:17 CST 2019
There was an unexpected error (type=Not Found, status=404).
No message available
后端错误如下(找不到“/swagger-ui.html”对应的“处理器”):
Did not find handler method for [/swagger-ui.html]
疑惑:这个应该在swagger-ui包的resources目录下,是已经存在的,为什么找不到?
找到了可行的方法:
@Configuration
public class SwaggerHandler extends WebMvcConfigurationSupport {
/**
* 页面中需要的资源添加资源处理器进行特殊处理
*/
@Override
protected 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/");
super.addResourceHandlers(registry);
}
/**
* 配置默认servlet处理
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
该类的目的,就是添加“资源处理器”来处理swagger页面相关的资源。仍旧提示原来的错误。
在以上SwaggerHandler类中的addResourceHandlers中打了断点,发现初始化时并没有调用该方法。
问题找到了,该方法没有执行,可是为什么没有执行呢!
经过几次试错,突然想起来可能存在多个WebMvcConfigurationSupport的子类,会不会是多个子类导致的(另一个WebMvcConfigurationSupport的子类用于将不存在的链接转化为json格式返回)。
@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {
/**
* 移动设备,不存在链接的拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MobileRequestInterceptor())
.addPathPatterns("/dev/**");
super.addInterceptors(registry);
}
}
根据这个猜想,将两个类合成一个(其实本身就应该写到一起):
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 移动设备,不存在链接的拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MobileRequestInterceptor())
.addPathPatterns("/dev/**");
super.addInterceptors(registry);
}
/**
* 页面中需要的资源添加资源处理器进行特殊处理
*/
@Override
protected 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/");
super.addResourceHandlers(registry);
}
/**
* 配置默认servlet处理
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
问题解决。
在一个项目中WebMvcConfigurationSupport只能存在一个,多个的时候,只有一个会生效。以后有机会再看看源码是怎么回事。