关于getRealPath("upload")返回为null的问题

来源:8-6 后台商品图片的springmvc上传与富文本上传ftp服务器功能开发1

qq_我就喵了个咪呀_0

2018-04-26

个人通过调查发现在课程所属项目的测试中发生该问题的原因是因为项目使用的tomcat版本的问题,Tomcat7中没有验证,以下仅以tomcat8为例说明:

找到getRealPath("upload"),通过intellij所提示的sourcecode找到的实现细节为spring-test的包中的实现,代码中其中已经避免了参数为"upload"会发生的错误,其代码如下:

protected String getResourceLocation(String path) {
  if (!path.startsWith("/")) {
     path = "/" + path;
  }
  return this.resourceBasePath + path;
}

但是实际上,这里生效的代码并非此处所显示的代码,而是tomecat中org.apache.catalina.core包中的ApllicationContext的getRealPath方法。

这个方法在tomecat8.0.29以前是存在Bug的,尽在代码注释中写明了情况,其写到

// The WebResources API expects all paths to start with /. This is a
// special case for consistency with earlier Tomcat versions.

但是却没有通过代码来解决一下,而是在参数不为空或者不以"/"开头返回null而不是自己加上"/".

该bug在这里可以看到https://bz.apache.org/bugzilla/show_bug.cgi?id=58228

随后在2015/3/11号的一次提交中被修复,该修复代码在15年8月发布的8.0.29版本中被发布,具体可参见

https://github.com/apache/tomcat80/blob/TOMCAT_8_0_29/java/org/apache/catalina/core/ApplicationContext.java

我这里想问的是:我怎么才能在tomcat中用spring的该实现??

写回答

1回答

Geely

2018-05-01

你好,亲爱的同学,非常赞,赞整体查找这个问题是思路及尝试!!

我仔细看了两遍,非常好。然后现在的问题是,我们项目是用的tomcat7,的确没有发生这个问题。而且经过验证也都是OK的。同学改用tomcat8,发现bug,并且看到了在某个版本修复。如果同学换成修复后的tomcat版本,是否正常呢?

另外

我对你的提问,没理解到位。。


"我怎么才能在tomcat中用spring的该实现??"    这个是指什么呢?

只要把我们的web容器换成新版本的tomcat就可以了。

0
2
Geely
回复
qq_我就喵了个咪呀_0
我明白你的意思啦,亲爱的同学,这个可能无法控制呀..如果是用容器,肯定要走servlet的api,如果是springtest的话。和web容器无关,这种应该是可以的。可以只使用springtest。看看里面可否人工干预注入
2018-05-04
共2条回复

从0开始 独立完成企业级Java电商网站服务端开发

前后端分离,数据库接口设计,架构设计,功能开发,上线运维

9476 学习 · 8804 问题

查看课程