这里我就不多讲springmvc是如何配置实现如何上传的了,需要的读者可以查看一下如下博客:
http://exceptioneye.iteye.com/blog/1314958
我主要是分析一下我遇到的一个问题:
报错:
org.springframework.web.multipart.MultipartException: The current request is not a multipart request
在springmvc在请求到达的时候DispatcherServlet这个类来进行处理,
在doDispatch这个中有一个专门检测是否为multipartRequest
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
在进入checkMultipart(HttpServletRequest request)中
protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException {
if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {
if (WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class) != null) {
logger.debug("Request is already a MultipartHttpServletRequest - if not in a forward, " +
"this typically results from an additional MultipartFilter in web.xml");
}
else if (request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) instanceof MultipartException) {
logger.debug("Multipart resolution failed for current request before - " +
"skipping re-resolution for undisturbed error rendering");
}
else {
return this.multipartResolver.resolveMultipart(request);
}
}
// If not returned before: return original request.
return request;
}
方法中会首先检测你是否配置了MultipartResolver,然而debug发现multipartResolver==null,直接就返回了request,就判断了该请求并非
multipartRequest请求,multipartRequestParsed任为false
为什么multipartResolver==null,在dispatcher-servlet.xml里面配置
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1000000000"/>
</bean>
然而通过debug初始化multipartResolver中发现,这个bean并没有注入到spring中,然后将这个bean放入在applicationContext.xml就成功注入了(暂时没有找到为什么dispatcher-servlet.xml中为什么注入不了,以前是可以的,以后找到了原因在进行分享吧,也希望读者提供帮助)
private void initMultipartResolver(ApplicationContext context) {
try {
this.multipartResolver = context.getBean(MULTIPART_RESOLVER_BEAN_NAME, MultipartResolver.class);
if (logger.isDebugEnabled()) {
logger.debug("Using MultipartResolver [" + this.multipartResolver + "]");
}
}
catch (NoSuchBeanDefinitionException ex) {
// Default is no multipart resolver.
this.multipartResolver = null;
if (logger.isDebugEnabled()) {
logger.debug("Unable to locate MultipartResolver with name '" + MULTIPART_RESOLVER_BEAN_NAME +
"': no multipart request handling provided");
}
}
}