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。