• 跟着视频学习java,发现swagger打不开?怎么解决


    前因

    现在到处都在卷java,不会java的前端不是好前端。

    这不,周围有前端同学开始学java了。

    昨天他突然找我问说引入依赖,配置之后swagger打不开了。

    分析过程

    1、

    查看他的swagger版本,让他试了对应路径/swagger-ui/index.html,确定一下真的打不开

    2、

    依赖和swagger配置拿过来我的纯净项目里边,发现能跑。如下

    1. @Configuration
    2. @EnableSwagger2
    3. public class InitSwagger {
    4. @Bean
    5. public Docket api() {
    6. return new Docket(DocumentationType.SWAGGER_2)
    7. .select()
    8. .apis(RequestHandlerSelectors.basePackage("com.springbootlearn.controller")) // 替换成你的Controller包名
    9. .paths(PathSelectors.any())
    10. .build()
    11. .apiInfo(new ApiInfoBuilder()
    12. .title("API文档")
    13. .description("描述你的API信息")
    14. .version("1.0")
    15. .build());
    16. }
    17. }
    1. <dependency>
    2. <groupId>io.springfoxgroupId>
    3. <artifactId>springfox-boot-starterartifactId>
    4. <version>3.0.0version>
    5. dependency>

     

    3、

    他的项目压缩,发给我,发现我这也访问不到。

    我再一看,他的配置里边有个静态资源配置如下,这是他照着学习视频写的。

    1. @Slf4j
    2. @Configuration
    3. public class WebResources extends WebMvcConfigurationSupport {
    4. @Override
    5. protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    6. log.info("启动资源映射");
    7. super.addResourceHandlers(registry);
    8. registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    9. }
    10. }

    说实话,这个配置我不太熟悉,有点忘记了。但是一看就是和静态资源相关。而且一眼看过去有点疑惑,为什么super的调用不是放在最后。

    注释掉,访问到swagger一气呵成。

    4、

    明白了问题所在,开始分析这个配置的作用,看起来是拦截static的路径到自己static的资源目录下。不管三七二十八直接debug到FrameworkServlet下doGet里边,最后来到了doDispatch下的getHandler方法中查看handlerMappings的SimpleUrlHandlerMapping中的urlMap。

    对比后发现上述配置中urlMap的key只有一个/static/**

    而不加配置urlMap的key有以下

     5、

    分析到这里,想要让以上配置正确能访问到swagger,我相信你已经想到办法了,就是再加swagger-ui的前缀,如下

    1. @Slf4j
    2. @Configuration
    3. public class WebResources extends WebMvcConfigurationSupport {
    4. @Override
    5. protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    6. log.info("启动资源映射");
    7. super.addResourceHandlers(registry);
    8. registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    9. registry.addResourceHandler("/swagger-ui/**")
    10. .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
    11. .resourceChain(false);
    12. }
    13. }

    访问之后发现通了。你以为结束了吗?没有。

    6、

    但是,但是你想过没,如果我们引入其他内置框架也有静态资源呢,难不成引入一种,去查一种?这种重写的方法显然不合适,我们要做的是追加而不是重写。但是如何追加?我也不知道,所以现在开始看配置。既然swagger能追加,我们也能追加,我们看swagger怎么做的就好了。

    点进去super.addResourceHandlers(registry);发现是空实现,这也就说明了这个玩意放在哪都无所谓,解答了我前边的疑惑。直接在WebMvcConfigurationSupport类里边搜索this.addResourceHandlers(registry);看看如果我们不实现addResourceHandlers方法,框架是怎么默认走的。

    最后来到WebMvcConfigurerComposite的addResourceHandlers方法,可以看到是遍历delegates分别添加,这不就是追加嘛!

    当delegates是swagger的配置时 我们点进去查看,发现如下场景

     人家是实现了WebMvcConfigurer而不是继承的WebMvcConfigurationSupport,照猫画虎呗,结果就有了以下配置

    1. @Slf4j
    2. @Configuration
    3. public class WebResources implements WebMvcConfigurer {
    4. @Override
    5. public void addResourceHandlers(ResourceHandlerRegistry registry) {
    6. registry.
    7. addResourceHandler("/static/**")
    8. .addResourceLocations("classpath:/static/")
    9. .resourceChain(false);
    10. }
    11. }

    尝试访问,可以访问,完结。

  • 相关阅读:
    QTableWidget常用信号的功能
    linux性能分析(三)性能优化导轮
    Java EE——阻塞队列
    使用Fiddler进行手机抓包
    manjaro 记录 1 安装流程
    14.8 Socket 一收一发通信
    jsp家教信息发布网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
    四十一、Fluent初学者学习流程
    【面试题 - spring】二
    第三方支付功能测试点【杭州多测师_王sir】【杭州多测师】
  • 原文地址:https://blog.csdn.net/wai_58934/article/details/132730303