我在github给Srping提了个BUG,竟然这样回复我...

我给Srping提了个BUG,竟然这样回复我…

前段时间,闲来无事,就趁着上班时间去开源社区摸鱼。就Fork了Spring,Spring Boot和Dubbo这几个开源项目。

没想到,我自己折腾着,还真发现了Spring的一个Bug,这是我提的issue,传送门。

如何Fork开源项目

这里呢,我就不做过多赘述,给读者一个传送门,想了解去读这篇文章

如何找开源项目的bug

找开源项目的BUG,最快的方式就是翻github上该项目的issue,比如我发现的这个bug,就是看到issue清单里有一个哥们提了个webflux的bug , 传送门。

我们简单地看下这哥们的描述,当同时使用Spring Webflux, Spring Security,因为基于Spring Security的项目,首次访问任何页面都需要输入admin的密码。然后重定向到你想要访问的页面,但是实际上,重定向404了。404意味着,这个请求地址不存在,但实际上这个地址是真实存在的。并且导致页面404,是因为使用了spring.webflux.base-path=/test

当我看懂他的描述,我依旧不知道是什么原因和场景,我就去复现,实际情况确实如那位哥们说的那样。小伙伴们,你们也可以尝试下复现。Spring BootCommitter给这个issue贴上了BUG的标签。

但是我在复现过程中,也发现了一个issue,提了issue给Spring Framework。我是使用Spring Boot运行项目的,我的代码如下:

Dependencies

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

我仅仅依赖了Spring web

application.properties

#spring.webflux.base-path=/base
spring.mvc.servlet.path=/test

Controller

package com.dogecoin.test.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestIssueController {

    @GetMapping("/test")
    public String testOne(){
        return "test";
    }

    @GetMapping("/test1")
    public String testTwo(){
        return "test1";
    }
}

这里简单说下,spring.mvc.servlet.path=/test这个配置,相当于Web项目访问的根Servlet path,相当于给项目所有的URL都加上了/test的前缀。所以我们启动项目以后,我们可以访问到ip:port/test/testip:port/test/test1,但是出人意料的是,我竟然还可以访问到``ip:port/test,但是我访问不了ip:port/test`,这就很疑惑了。

于是就有了下文。

怎么给开源项目提issue

我发现了这个令人疑惑的事情以后呢,我就去提issue给Spring,这里我说一下,因为github是一个全球性的开源项目网站,所以我们在上面都用英文沟通。他们回复的效率真的蛮高的,我发表以后没到半小时就收到了回复。

而且给我写了一个非常详尽的回复,如下:

我在github给Srping提了个BUG,竟然这样回复我..._第1张图片

我简单解释下:

这位维护者说,这部分代码是spring框架非常老的部分,他猜测导致我上述清楚产生有2个原因。

  1. 对于扩展的Servlet映射,在这种情况下pathInfo为null,因此ServletPath中没有路径,即整个路径都是ServletPath。(其实就是说我没有在controller上加servlet path)
  2. 即使对于通过前缀映射的Servlet,返回“”也不是一个好的结果,因为如果您有两个Servlet映射到了不同的前缀(例如“ / foo”和“ / bar”),那么对“ / foo”和“ / bar”的请求在应用程序中都将显示为“”,并且无法区分两者。

然后,他给了建议,不要使用servletPath前缀也在应用程序映射中重复的映射,还建议不要通过servletPath prefix使用映射。

在我看来,讲了这么多都是建议,但是代码是不会骗人的,这明明是程序逻辑上的问题,如果通过约定解决的话,那么spring.mvc.servlet.path这个配置存在的问题是不是就解决不了呢?当然有时候约定确实能避免很多麻烦,于是我继续问他:
我在github给Srping提了个BUG,竟然这样回复我..._第2张图片

Spring 的大佬,承认了必须遵守约定,而且他的同事也出来回复我,强行甩锅给我:

我在github给Srping提了个BUG,竟然这样回复我..._第3张图片
我再简单翻译一下:

  • 不遵守约定导致的,我们的程序无法识别!hahaha~

到这里,我寻思着,双拳难敌四手,也没啥好说的了,人家说不是BUG,我们必须按照某些特定约定来写代码。

这个issue也到此为止了,不过我仍然认为这是个缺陷~

总结一下

其实,大部分源码没那么可怕,像Spring,Spring Boot在java社区非常知名的开源项目,也存在大量的BUG。而且有些BUG,真的很低级。开源项目的程序员也是人,也会犯错。不过他们写的代码运用了设计模式,让可读性变差,所以你读起来费力。

另外,多去看看别人的issue,以及别人怎么样分析&解决这个issue,会让你对编程思维耳目一新。原来别人的代码是这样写的,别人的BUG修复这么有技巧,别人的代码写的真的很优美。

你可能感兴趣的:(开源项目)