2015-06-12 2 views
3

У меня возникли проблемы с использованием bean-компонента CommonsMultipartResolver в сочетании с инициализатором, который расширяет AbstractAnnotationConfigDispatcherServletInitializer.MultipartResolver and AbstractAnnotationConfigDispatcherServletInitializer

Я успешно использовал CommonsMultipartResolver в предыдущем проекте, но инициализатор реализует 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, я получаю следующее сообщение об ошибке:

Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided 

Итак, кто-нибудь знает, как сделать multipartResolver боба работу с AbstractAnnotationConfigDispatcherServletInitializer?

Другая важная информация:

WebMvcConfig.java

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = ...) 
public class WebMvcConfig extends WebMvcConfigurerAdapter { 
    ... 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
    configurer.enable(); 
    } 

} 

MultipartUploadConfig.java

@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 
+0

Это прекрасно работает для меня весной 4.x. Опубликуйте больше своего конфига. Напишите MCVE. –

+0

Хорошо, вы правы, это работает весной 4.x. Я попытался сделать MCVE и, по-видимому, это не Инициализатор, который испортил multipartResolver. Кажется, это фильтр безопасности. Я думаю, теперь вопрос в том, как использовать multipartResolver с Spring Securit 3.x. Я буду работать над MCVE и обновить сообщение. –

ответ

4

Понял. Варианты AbstractAnnotationConfigDispatcherServletInitializer и WebApplicationInitializer действительно соответствуют друг другу. Нет проблем. Проблема заключалась в том, что в проекте, использующем AbstractAnnotationConfigDispatcherServletInitializer, была также Spring Security, и это перепутало ситуацию.

При использовании Spring Security имя компонента многопоточного преобразователя должно быть @Bean(name = "filterMultipartResolver"). Конечно, это означает, что MultipartFilter должен быть установлен в AbstractSecurityWebApplicationInitializer следующим образом.

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

Привет, Ричард. Я получаю org.springframework.web.multipart.MultipartException: не удалось разобрать многосердечный запрос сервлета; Вложенное исключение - это java.lang.IllegalStateException: нет многостраничной конфигурации для исключения сервлета. Используются те же настройки, что и у вас, я использую сервер Jetty. Можете поделиться еще несколькими моментами о том, как вы использовали в контроллере. –

+0

Хотелось бы, чтобы я мог проголосовать за него 100 раз :) @Ramki берут имя bean, как указано в ответе, filterMultipartResolver, он будет работать с надеждой. –

+0

Решение работало для меня. Однако CORS не работает над URL-адресом для загрузки. – Kumait

Смежные вопросы