MultipartResolver和AbstractAnnotationConfigDispatcherServletInitializer

时间:2015-06-12 18:23:10

标签: java spring spring-mvc

我在使用price=[] def checkCondition(a,b): global price if a<b: price.append(123) # also works without the global price = 123 if __name__ == '__main__': checkCondition(1,2) print price bean和扩展CommonsMultipartResolver的初始化程序时遇到问题。

我在之前的项目中成功使用了CommonsMultipartResolver,但初始化程序实现了AbstractAnnotationConfigDispatcherServletInitializer

直观地说,我在扩展程序WebApplicationInitializer中执行了此操作。

AbstractAnnotationConfigDispatcherServletInitializer

我认为它与@Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[]{ MultipartUploadConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[]{ WebMvcConfig.class }; } 中的此代码具有相同的效果(这是工作配置)。

WebApplicationInitializer

使用@Override public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext(); dispatcherServlet.register(WebMvcConfig.class); ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(dispatcherServlet)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); rootContext.register(MultipartUploadConfig.class); servletContext.addListener(new ContextLoaderListener(rootContext)); } ,我收到以下错误:

AbstractAnnotationConfigDispatcherServletInitializer

那么,任何人都知道如何让multipartResolver bean与Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided 一起使用?

其他相关信息:

WebMvcConfig.java

AbstractAnnotationConfigDispatcherServletInitializer

MultipartUploadConfig.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;
  }
}

1 个答案:

答案 0 :(得分:4)

知道了。 AbstractAnnotationConfigDispatcherServletInitializerWebApplicationInitializer版本确实相互对应。没问题。问题是在使用AbstractAnnotationConfigDispatcherServletInitializer的项目中,还有Spring Security并且搞砸了。

使用Spring Security时,多部分解析程序的Bean名称应为@Bean(name = "filterMultipartResolver")。当然,这意味着MultipartFilter应该像AbstractSecurityWebApplicationInitializer这样设置。

@Override
  protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
    insertFilters(servletContext, new MultipartFilter());
  }