2014-09-02 14 views
6

Tworzę usługę REST ze Spring i otrzymuję wyjątek informujący mnie o tym.Brak Spring Spring MultipartResolver w metodzie PUT

Oczekiwany MultipartHttpServletRequest: czy MultipartResolver jest skonfigurowany?

Po zmianie metody = RequestMethod.PUT na method = RequestMethod.POST działa.

Dlaczego otrzymuję ten wyjątek na PUT, ale nie na POST?

@Configuration 
@ComponentScan("io.myservice") 
@EnableAutoConfiguration 
@EnableCaching 
@EnableAsync(mode = ASPECTJ) 
public class Application implements AsyncConfigurer { 

static org.slf4j.Logger LOG = LoggerFactory.getLogger(Application.class); 

public static final String MAX_FILE_SIZE = "2MB"; 
public static final String MAX_REQUEST_SIZE = "2MB"; 
public static final String FILE_SIZE_THRESHOLD = "2MB"; 

@Value("${app.dir.incoming}") 
public String createdDir; 

@Bean 
public LocalValidatorFactoryBean localValidatorFactoryBean() { 
    return new LocalValidatorFactoryBean(); 
} 

@Bean 
MultipartConfigElement multipartConfigElement() { 
    String absTempPath = new File(createdDir).getAbsolutePath(); 
    MultipartConfigFactory factory = new MultipartConfigFactory(); 
    factory.setMaxFileSize(MAX_FILE_SIZE); 
    factory.setMaxRequestSize(MAX_REQUEST_SIZE); 
    factory.setFileSizeThreshold(FILE_SIZE_THRESHOLD); 
    factory.setLocation(absTempPath); 
    return factory.createMultipartConfig(); 
} 

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

@Override 
@Bean 
public ThreadPoolTaskExecutor getAsyncExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setCorePoolSize(2); 
    executor.setMaxPoolSize(2); 
    executor.setQueueCapacity(5); 
    executor.initialize(); 
    return executor; 
} 

@Bean 
public SimpleCacheManager cacheManager(){ 
    SimpleCacheManager cacheManager = new SimpleCacheManager(); 
    List<Cache> caches = new ArrayList<Cache>(); 
    caches.add(cacheBean()); 
    cacheManager.setCaches(caches); 
    return cacheManager; 
} 

@Bean 
public Cache cacheBean(){ 
    Cache cache = new ConcurrentMapCache("default"); 
    return cache; 
} 

public static void main(String[] args) throws IOException { 
    SysOutOverSLF4J.sendSystemOutAndErrToSLF4J(); 
    run(Application.class, args); 
} 
} 


@RequestMapping(value="/converter", method=RequestMethod.PUT) 
@ResponseBody 
public String convert(MultipartFile file) { 
    LOG.info("received new file to convert") 
} 


Caused by: java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured? 
at org.springframework.util.Assert.notNull(Assert.java:112) 
at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.resolveName(RequestParamMethodArgumentResolver.java:171) 
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:89) 
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:79) 
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157) 
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
... 37 common frames omitted 
+1

Nie jestem pewien, czy PUT jest zawarte w specyfikacji dla żądań wieloczęściowych (w specyfikacji serwletu). Jak przesyłasz dane? –

Odpowiedz

10

wieloczęściowej wsparcie Stosowane do wiosny nie obsługuje inny sposób żądania następnie POST. Dla StandardServletMultipartResolver jest to zakodowane na stałe w tej klasie.

Dla CommonsMultipartResolver jest on zakodowany w klasie narzędziowej ServletFileUpload z projektu Apache Commons Fileupload.

Tthe Form-based File Upload in HTML (RFC1867) nie mówi tak naprawdę, ale jedyną wzmianką o używanej metodzie HTTP jest POST.

W skrócie, obecnie POST jest obsługiwany przez frameworki, które mogą być w stanie obejść je przez reimplemening niektórych klas, ale jeśli to działa (szczególnie z domyślną obsługą przesyłania plików Servlet 3.0) może zależeć od twojego kontenera.

0

Co działa na mnie z PUT używa InputStream zamiast MultipartFile

@RequestMapping(value="/converter", method=RequestMethod.PUT) 
    @ResponseBody 
    public String convert(InputStream file) 

ten sposób udało mi się wykorzystać file body i multipart body przesłać zawartość pliku.

Powiązane problemy