前段时间,闲来无事,就趁着上班时间去开源社区摸鱼。就Fork了Spring,Spring Boot和Dubbo这几个开源项目。
没想到,我自己折腾着,还真发现了Spring的一个Bug,这是我提的issue,传送门。
这里呢,我就不做过多赘述,给读者一个传送门,想了解去读这篇文章
找开源项目的BUG,最快的方式就是翻github上该项目的issue,比如我发现的这个bug,就是看到issue清单里有一个哥们提了个webflux的bug , 传送门。
我们简单地看下这哥们的描述,当同时使用Spring Webflux
, Spring Security
,因为基于Spring Security
的项目,首次访问任何页面都需要输入admin的密码。然后重定向到你想要访问的页面,但是实际上,重定向404了。404意味着,这个请求地址不存在,但实际上这个地址是真实存在的。并且导致页面404,是因为使用了spring.webflux.base-path=/test
。
当我看懂他的描述,我依旧不知道是什么原因和场景,我就去复现,实际情况确实如那位哥们说的那样。小伙伴们,你们也可以尝试下复现。Spring Boot
的Committer
给这个issue贴上了BUG的标签。
但是我在复现过程中,也发现了一个issue,提了issue给Spring Framework
。我是使用Spring Boot
运行项目的,我的代码如下:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
我仅仅依赖了Spring web
#spring.webflux.base-path=/base
spring.mvc.servlet.path=/test
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/test
和ip:port/test/test1
,但是出人意料的是,我竟然还可以访问到``ip:port/test,但是我访问不了
ip:port/test`,这就很疑惑了。
于是就有了下文。
我发现了这个令人疑惑的事情以后呢,我就去提issue给Spring,这里我说一下,因为github是一个全球性的开源项目网站,所以我们在上面都用英文沟通。他们回复的效率真的蛮高的,我发表以后没到半小时就收到了回复。
而且给我写了一个非常详尽的回复,如下:
我简单解释下:
这位维护者说,这部分代码是spring框架非常老的部分,他猜测导致我上述清楚产生有2个原因。
然后,他给了建议,不要使用servletPath
前缀也在应用程序映射中重复的映射,还建议不要通过servletPath prefix
使用映射。
在我看来,讲了这么多都是建议,但是代码是不会骗人的,这明明是程序逻辑上的问题,如果通过约定解决的话,那么spring.mvc.servlet.path
这个配置存在的问题是不是就解决不了呢?当然有时候约定确实能避免很多麻烦,于是我继续问他:
Spring 的大佬,承认了必须遵守约定,而且他的同事也出来回复我,强行甩锅给我:
到这里,我寻思着,双拳难敌四手,也没啥好说的了,人家说不是BUG,我们必须按照某些特定约定来写代码。
这个issue也到此为止了,不过我仍然认为这是个缺陷~
其实,大部分源码没那么可怕,像Spring
,Spring Boot
在java社区非常知名的开源项目,也存在大量的BUG。而且有些BUG,真的很低级。开源项目的程序员也是人,也会犯错。不过他们写的代码运用了设计模式,让可读性变差,所以你读起来费力。
另外,多去看看别人的issue,以及别人怎么样分析&解决这个issue,会让你对编程思维耳目一新。原来别人的代码是这样写的,别人的BUG修复这么有技巧,别人的代码写的真的很优美。