1、问题描述:
最近在使用Spring、Springmvc 新的 4.3.0 版本搭建开发框架;
jdk使用了1.8的版本,Tomcat服务器使用了apache-tomcat-6.0.32.tar.gz 版本;
根据以上的环境,通过如下的访问方式:http://man.notice.jd.com/worker/once?quartzBeanId=1000;
后台Springmvc 的 Controller 处理方法在获取 quartzBeanId 时值为 null
@RequestMapping("/once")
public String once(String quartzBeanId) {
log.info("quartzBeanId=" + quartzBeanId);
return "forward:/worker/list";
}
2、问题跟踪
通过跟踪源代码,发现在Spring Mvc 源码
org.springframework.web.multipart.support.MultipartResolutionDelegate#resolveMultipartArgument
org.springframework.web.multipart.support.MultipartResolutionDelegate#isPartCollection
该方法返回了 true
private static boolean isPartCollection(MethodParameter methodParam) {
return (servletPartClass == getCollectionParameterType(methodParam));
}
为什么会返回 true ?
通过断点发现:servletPartClass = null
看 org.springframework.web.multipart.support.MultipartResolutionDelegate 源代码如下:
servletPartClass 是在静态块里面被初始化的,但是通过 try …… catch 抓住了异常情况,问题就出在这里面,javax.servlet.http.Part 这个类在 apache-tomcat-6.0.32.tar.gz 版本的 servlet-api.jar 中不存在!!!
public abstract class MultipartResolutionDelegate {
public static final Object UNRESOLVABLE = new Object();
private static Class<?> servletPartClass = null;
static {
try {
servletPartClass = ClassUtils.forName("javax.servlet.http.Part",
MultipartResolutionDelegate.class.getClassLoader());
}
catch (ClassNotFoundException ex) {
// Servlet 3.0 javax.servlet.http.Part type not available -
// Part references simply not supported then.
}
}
}
以下是Tomcat7 源码解压的截图。
3、问题解决方案
将Tomcat的版本升级到 7.0 以上的版本之后,这个问题就解决了!!!