2014-05-09 14 views
8

Tôi đang sử dụng phương pháp Java tất cả để cấu hình Spring MVC và không thể tìm ra cách liên kết MultipartConfigElement với DispatcherServlet theo chương trình của tôi.Cấu hình Java 4 mùa xuân cho MultipartResolver cho Servlet 3.0

tài liệu Xuân khẳng định:

Để sử dụng Servlet 3.0 dựa phân tích nhiều phần dữ liệu, bạn cần phải đánh dấu các DispatcherServlet với một phần "multipart-config" trong web.xml, hoặc với một javax .servlet.MultipartConfigElement trong chương trình đăng ký Servlet ...

http://docs.spring.io/spring/docs/4.0.4.RELEASE/spring-framework-reference/htmlsingle/#mvc-multipart

Đây là mã WebApplicationInitializer tôi:

public class DispatcherServletInitializer implements WebApplicationInitializer { 

    private static final Logger logger = LoggerFactory.getLogger(DispatcherServletInitializer.class); 

    @Override 
    public void onStartup(ServletContext container) { 

     // Create the 'root' Spring application context 
     AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
     rootContext.register(AppConfig.class); 

     // Manage the lifecycle of the root application context 
     container.addListener(new ContextLoaderListener(rootContext)); 

     // Create the dispatcher servlet's Spring application context 
     AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext(); 
     dispatcherContext.register(WebConfig.class); 

     //HOW CAN I ASSOCIATE THIS CONFIG WITH MY DISPATCHER SERVLET? 
     MultipartConfigElement config = new MultipartConfigElement("C:\\Temp", 20848820, 418018841, 1048576); 
     DispatcherServlet dispatcherServlet = new DispatcherServlet(dispatcherContext); 

     // Register and map the dispatcher servlet 
     ServletRegistration.Dynamic dispatcher = 
      container.addServlet("dispatcher", dispatcherServlet); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/*"); 
    } 

} 

Làm thế nào để kết hợp với MultipartConfigElementDispatcherServlet của tôi? Tôi không thấy bất kỳ phương thức nào như setMultipartConfiguration hoặc bất kỳ hàm tạo nào chấp nhận nó.

Cũng lưu ý rằng webconfig của tôi tuyên bố một MultipartResolver:

@Bean 
public StandardServletMultipartResolver multipartResolver(){ 
    return new StandardServletMultipartResolver(); 
} 

Nhưng tài liệu Xuân trạng thái:

Configuration settings such as maximum sizes or storage locations need to be applied at that Servlet registration level as Servlet 3.0 does not allow for those settings to be done from the MultipartResolver. 

Bất kỳ hướng dẫn sẽ được đánh giá rất nhiều.

Trả lời

11

Hình như bạn cần điều này:

ServletRegistration.Dynamic dispatcher = 
      container.addServlet("dispatcher", dispatcherServlet); 
dispatcher.setLoadOnStartup(1); 
dispatcher.addMapping("/*"); 

dispatcher.setMultipartConfig(new MultipartConfigElement("/tmp", 1024*1024*5, 1024*1024*5*5, 1024*1024)); 
+0

đóng đinh nó! Cảm ơn Artem! –

1

Dưới đây là giải pháp phù hợp với AbstractAnnotationConfigDispatcherServletInitializer cách cấu hình servlet. Điều này ít xâm phạm hơn WebApplicationInitializer.

Sử dụng ghi đè AbstractAnnotationConfigDispatcherServletInitializer.customizeRegistration.

public class MySpringWebSetup extends AbstractAnnotationConfigDispatcherServletInitializer 
{ 
    // Your usual obligatory configuration overrides: 
    @Override protected Class<?>[] getRootConfigClasses() { ... } 
    @Override protected Class<?>[] getServletConfigClasses() { ... } 
    @Override protected String[] getServletMappings() { ... } 

    // Optional configuration: 
    @Override 
    protected void customizeRegistration(Dynamic registration) { 
    registration.setMultipartConfig(
     // Maybe use more sophisticated configuration than this: 
     new MultipartConfigElement("") 
    ); 
    } 
} 

tôi thấy nó bắt stack trace của getServletMappings và do đó nhận được vào mã của org\springframework\web\servlet\support\AbstractDispatcherServletInitializer.java:

protected void registerDispatcherServlet(ServletContext servletContext) { 

    [more registration stuff was here] 

    registration.setLoadOnStartup(1); 
    registration.addMapping(getServletMappings()); 
    registration.setAsyncSupported(isAsyncSupported()); 

    Filter[] filters = getServletFilters(); 
    if (!ObjectUtils.isEmpty(filters)) { 
     for (Filter filter : filters) { 
      registerServletFilter(servletContext, filter); 
     } 
    } 


    customizeRegistration(registration); 
} 
Các vấn đề liên quan