Unable to process parts as no multi-part configuration has been provided
Solution 1
I don't know why they did this, but the MultipartResolver
bean in the context needs to be named multipartResolver
. Rename your @Bean
method to
public CommonsMultipartResolver multipartResolver(){ // lowercase 'P'
Or give it the name explicitly
@Bean(name = "multipartResolver")
public CommonsMultipartResolver canBeCalledAnything(){
Solution 2
It is straight forward from the exception that no multi-part configuration is found. Though you have provided multipartResolver bean.
The problem is that while specifying the MultipartFilter before the Spring Security filter, It tries to get the multipartResolver bean but can't find it. Because it expect the bean name/id as filterMultipartResolver instead of multipartResolver.
Do yourself a favor. Please change the bean configuration like following -
@Bean
public CommonsMultipartResolver filterMultipartResolver(){
CommonsMultipartResolver resolver = new
CommonsMultipartResolver();
return resolver;
}
or
@Bean(name = "filterMultipartResolver")
public CommonsMultipartResolver multiPartResolver(){
CommonsMultipartResolver resolver = new
CommonsMultipartResolver();
return resolver;
}
royB
Updated on July 10, 2022Comments
-
royB almost 2 years
I wrote a simple controller for uploading files:
@RestEndpoint public class ImageController { @Autowired GridFsTemplate mTemplate; @RequestMapping(value = "images", method = RequestMethod.POST) public @ResponseBody String testPhoto(@RequestParam String name, @RequestParam String directory, @RequestParam MultipartFile file) throws IOException { if(!file.isEmpty()){ final byte[] bytes = file.getBytes(); InputStream inputStream = new ByteArrayInputStream(bytes); mTemplate.store(inputStream, "name"); return "uploaded photo"; } return "failed"; } }
@RestEndpoint
annotation is:@Target({ ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented @Controller public @interface RestEndpoint { String value() default ""; }
My ContextCOnfiguration class is:
@Configuration @EnableWebMvc @ComponentScan( basePackages = "com.questter.site", useDefaultFilters = false, includeFilters = @ComponentScan.Filter({RestEndpoint.class, RestEndpointAdvice.class}) ) public class RestServletContextConfiguration extends WebMvcConfigurerAdapter { @Bean public CommonsMultipartResolver multiPartResolver(){ CommonsMultipartResolver resolver = new CommonsMultipartResolver(); return resolver; } ... }
--- UPDATED ---
web.xml
file:<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>Spring Application</display-name> <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspf</url-pattern> <page-encoding>UTF-8</page-encoding> <scripting-invalid>true</scripting-invalid> <include-prelude>/WEB-INF/jsp/base.jspf</include-prelude> <trim-directive-whitespaces>true</trim-directive-whitespaces> <default-content-type>text/html</default-content-type> </jsp-property-group> </jsp-config> <!--<context-param>--> <!--<param-name>spring.profiles.active</param-name>--> <!--<param-value>development</param-value>--> <!--</context-param>--> <session-config> <session-timeout>30</session-timeout> <cookie-config> <http-only>true</http-only> </cookie-config> <tracking-mode>COOKIE</tracking-mode> </session-config> <distributable /> </web-app>
---- UPDATED ----
public class Bootstrap implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) throws ServletException { container.getServletRegistration("default").addMapping("/resource/*"); AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); rootContext.register(RootContextConfiguration.class); container.addListener(new ContextLoaderListener(rootContext)); AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext(); webContext.register(WebServletContextConfiguration.class); ServletRegistration.Dynamic dispatcher = container.addServlet( "springWebDispatcher", new DispatcherServlet(webContext) ); dispatcher.setLoadOnStartup(1); dispatcher.setMultipartConfig(new MultipartConfigElement( null, 20_971_520L, 41_943_040L, 512_000 )); dispatcher.addMapping("/"); AnnotationConfigWebApplicationContext restContext = new AnnotationConfigWebApplicationContext(); restContext.register(RestServletContextConfiguration.class); DispatcherServlet servlet = new DispatcherServlet(restContext); servlet.setDispatchOptionsRequest(true); dispatcher = container.addServlet( "springRestDispatcher", servlet ); dispatcher.setLoadOnStartup(2); dispatcher.addMapping("/rest/*"); rootContext.refresh(); DbBootstrap dbBootstrap = rootContext.getBean(DbBootstrap.class); dbBootstrap.init(); } }
When perfoming a post request (using postman) i'm getting:
HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException:Expected MultipartHttpServletRequest: is a MultipartResolver configured
I've looked over some similar questions over stackoverflow but none of the answers helped me.
Spring version is: 4.0.4
Any help will be greatly appreciated (with a thumbs up of course).
Thanks
-
arthur over 6 yearsthe accepted answer above actually did it for me. May be your answer is appropriate for an another situation.
-
Ramjan Ali about 6 yearsI think this is because of the versions. Accepted answer didn't work for me. I researched more and found that changed bean name solved the issue.