2014-09-02 10 views
6

Ich erstelle einen REST-Service mit Spring und bekomme eine Exception, die mir folgendes sagt.Spring Boot MultipartResolver fehlt auf PUT-Methode

Erwartete MultipartHttpServletRequest: ist ein MultipartResolver konfiguriert?

Wenn ich Methode = RequestMethod.PUT zu Methode = RequestMethod.POST ändern, funktioniert es.

Warum bekomme ich diese Ausnahme auf PUT, aber nicht auf 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

Ich bin nicht sicher, PUT ist in der Spezifikation für mehrteilige Anfragen enthalten (in der Servlet-Spezifikation). Wie senden Sie die Daten? –

Antwort

10

Die mehrteilige Unterstützung wie von Spring dann POST nicht verwendet keine anderen Anforderungsmethode unterstützen. Für die StandardServletMultipartResolver ist dies in dieser Klasse fest codiert.

Für die CommonsMultipartResolver ist es in der ServletFileUpload Utility-Klasse aus dem Apache Commons Fileupload Projekt fest codiert.

Die Form-based File Upload in HTML (RFC1867) ist nicht wirklich explizit darüber, aber die einzige Erwähnung einer verwendeten HTTP-Methode ist POST.

Kurz gesagt, nur POST wird von den Frameworks unterstützt, die Sie möglicherweise umgehen, indem Sie einige Klassen neu implementieren, aber wenn es funktioniert (vor allem mit der Standardunterstützung für den Upload von Servlet 3.0), hängt möglicherweise von Ihrem Container ab.

0

Was für mich mit PUT arbeitet, ist mit einem InputStream statt MultipartFile

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

Auf diese Weise konnte ich file body und multipart body verwenden, um den Dateiinhalt zu laden.