Java MultipartResolver和AbstractAnnotationConfigDispatcherServletInitializer
我在将Java MultipartResolver和AbstractAnnotationConfigDispatcherServletInitializer,java,spring,spring-mvc,Java,Spring,Spring Mvc,我在将commonmultipartresolverbean与扩展AbstractAnnotationConfigDispatcherServletInitializer的初始值设定项结合使用时遇到问题 @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[]{ MultipartUploadConfig.class }; } @
commonmultipartresolver
bean与扩展AbstractAnnotationConfigDispatcherServletInitializer
的初始值设定项结合使用时遇到问题
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{
MultipartUploadConfig.class
};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{
WebMvcConfig.class
};
}
我在以前的项目中成功地使用了CommonsMultipartResolver,但是初始化器实现了WebApplicationInitializer
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{
MultipartUploadConfig.class
};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{
WebMvcConfig.class
};
}
直观地说,我是在扩展AbstractAnnotationConfigDispatcherServletInitializer的初始值设定项中这样做的
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{
MultipartUploadConfig.class
};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{
WebMvcConfig.class
};
}
使用AbstractAnnotationConfigDispatcherServletInitializer
,我得到以下错误:
Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided
那么,有人知道如何使多部分解析器bean与AbstractAnnotationConfigDispatcherServletInitializer
一起工作吗
其他有关资料:
WebMvcConfig.java
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = ...)
public class WebMvcConfig extends WebMvcConfigurerAdapter {
...
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
@Configuration
public class MultipartUploadConfig {
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(8192);
multipartResolver.setDefaultEncoding("utf-8");
return multipartResolver;
}
}
multiportuploadconfig.java
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = ...)
public class WebMvcConfig extends WebMvcConfigurerAdapter {
...
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
@Configuration
public class MultipartUploadConfig {
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(8192);
multipartResolver.setDefaultEncoding("utf-8");
return multipartResolver;
}
}
堆栈跟踪:
[http-nio-8080-exec-4] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [dispatcher] in context with path [] threw exception
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:100)
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:78)
at org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:76)
at org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:108)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided
at org.apache.catalina.connector.Request.parseParts(Request.java:2669)
at org.apache.catalina.connector.Request.getParts(Request.java:2636)
at org.apache.catalina.connector.RequestFacade.getParts(RequestFacade.java:1083)
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:85)
... 23 more
[http-nio-8080-exec-4]org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service(),用于路径为[]的上下文中的Servlet[dispatcher]引发异常
org.springframework.web.multipart.MultipartException:无法解析多部分servlet请求;嵌套异常为java.lang.IllegalStateException:无法处理部件,因为未提供多部件配置
位于org.springframework.web.multipart.support.StandardMultipartTTpServletRequest.parseRequest(StandardMultipartTTpServletRequest.java:100)
位于org.springframework.web.multipart.support.StandardMultipartTTpServletRequest。(StandardMultipartTTpServletRequest.java:78)
位于org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:76)
位于org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:108)
位于org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
位于org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
位于org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
位于org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086)
位于org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659)
位于org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
位于org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558)
位于org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
位于org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
运行(Thread.java:745)
原因:java.lang.IllegalStateException:无法处理部件,因为未提供多部件配置
位于org.apache.catalina.connector.Request.parseParts(Request.java:2669)
位于org.apache.catalina.connector.Request.getParts(Request.java:2636)
位于org.apache.catalina.connector.RequestFacade.getParts(RequestFacade.java:1083)
位于org.springframework.web.multipart.support.StandardMultipartTTpServletRequest.parseRequest(StandardMultipartTTpServletRequest.java:85)
... 23多
明白了。AbstractAnnotationConfigDispatcherServletInitializer
和WebApplicationInitializer
版本确实相互对应。没问题。问题在于,在使用AbstractAnnotationConfigDispatchersServletInitializer
的项目中,还存在Spring安全性,这会把事情搞砸
使用Spring安全性时,多部分解析器的Bean名称应为@Bean(name=“filterMultipartResolver”)
。当然,这意味着应该像这样在AbstractSecurityWebApplicationInitializer
中设置MultipartFilter
@Override
protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
insertFilters(servletContext, new MultipartFilter());
}
这在Spring4.x上对我来说很好。发布更多的配置文件。写一个MCVE。好的,你是对的,这在Spring4.x中有效。我试着做了一个MCVE,显然,并不是初始化器搞乱了多部分解析器。它似乎是安全过滤器。我想现在的问题是如何在SpringSecurit3.x中使用multipartResolver。我会做一个MCVE并更新帖子。嗨,Richard。我得到org.springframework.web.multipart.MultipartException:无法解析多部分servlet请求;嵌套的异常是java.lang.IllegalStateException:servlet异常没有多部分配置。使用与您相同的设置,我使用的是Jetty服务器。我希望我能投票100次:)@Ramki接受答案中给出的bean名称,filterMultipartResolver,希望它能工作。这个解决方案对我有效。但是,CORS没有处理上传URL。