2015-06-10 13 views
9

ho cercato di utilizzare CommonsMultipartResolver in Boot tradurre la mia vecchia applicazione (WAR) per l'avvio, e in questo momento ha ottenuto il seguente codice:Come utilizzare CommonsMultipartResolver nella primavera del Boot

@Configuration 
    public class TestConfig { 

     @Bean 
     public FilterRegistrationBean openEntityManagerFilterRegistrationBean() { 
      // Set upload filter 
      final MultipartFilter multipartFilter = new MultipartFilter(); 
      final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(multipartFilter); 
      filterRegistrationBean.addInitParameter("multipartResolverBeanName", "commonsMultipartResolver"); 

      return filterRegistrationBean; 
     } 

     @Bean 
     public CommonsMultipartResolver commonsMultipartResolver() { 
      final CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); 
      commonsMultipartResolver.setMaxUploadSize(-1); 

      return commonsMultipartResolver; 
     } 
    } 

E 'questo il modo giusto in Avvio, perché ho visto alcune proprietà da applicare in application.properties. Sarebbero lo stesso scopo che definire un FilterRegistrationBean?

# MULTIPART (MultipartProperties) 
multipart.enabled=true 
multipart.file-size-threshold=0 # Threshold after which files will be written to disk. 
multipart.location= # Intermediate location of uploaded files. 
multipart.max-file-size=1Mb # Max file size. 
multipart.max-request-size=10Mb # Max request size. 

Qualcuno può fornire qualche esempio su come utilizzarlo? Grazie.

Tra l'altro, ha cercato di impostare la proprietà "multipart.enabled = true" e ho ottenuto:

Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'enabled' of bean class [org.springframework.boot.autoconfigure.web.MultipartProperties]: Bean property 'enabled' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? 
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1076) 
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:927) 
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:95) 
    at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:749) 
    at org.springframework.validation.DataBinder.doBind(DataBinder.java:645) 
    at org.springframework.boot.bind.RelaxedDataBinder.doBind(RelaxedDataBinder.java:121) 
    at org.springframework.validation.DataBinder.bind(DataBinder.java:630) 
    at org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:253) 
    at org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:227) 
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:296) 
    ... 73 common frames omitted 

risposta

2

Questo è stato un bug nella primavera del boot e sarà fissato in 1.2.5.

1

In primo luogo, non v'è alcuna abilitato proprietà in org.springframework.boot.autoconfigure.web.MultipartProperties di classe.

consultare https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/MultipartProperties.java

Se si utilizza servlet container 3 non avete bisogno di usare il meccanismo commons-fileupload e supporto Multipart è abilitato di default. Se non si desidera personalizzare alcuna configurazione predefinita multipart non è necessario aggiungere alcuna configurazione in application.properties.

<form method="post" action="upload" enctype="multipart/form-data"> 
    File: <input type="file" name="file"/> 
    <input type="submit" value="Submit"/> 
</form> 

@RequestMapping(value="/upload", method=RequestMethod.POST) 
public String upload(@RequestPart("file") MultipartFile multipartFile) 
{ 
    System.out.println(multipartFile.getOriginalFilename()); 
    return "redirect:/"; 
} 

Se si desidera utilizzare commons-fileupload poi aggiungendo seguente configurazione sta funzionando bene:

package demo; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.context.embedded.FilterRegistrationBean; 
import org.springframework.context.annotation.Bean; 
import org.springframework.web.multipart.commons.CommonsMultipartResolver; 
import org.springframework.web.multipart.support.MultipartFilter; 

@SpringBootApplication 
public class BootDemoApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(BootDemoApplication.class, args); 
    } 

    @Bean 
    public CommonsMultipartResolver commonsMultipartResolver() { 
     final CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); 
     commonsMultipartResolver.setMaxUploadSize(-1); 
     return commonsMultipartResolver; 
    } 

    @Bean 
    public FilterRegistrationBean multipartFilterRegistrationBean() { 
     final MultipartFilter multipartFilter = new MultipartFilter(); 
     final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(multipartFilter); 
     filterRegistrationBean.addInitParameter("multipartResolverBeanName", "commonsMultipartResolver"); 
     return filterRegistrationBean; 
    } 
} 

E, naturalmente, abbiamo bisogno di aggiungere commons-fileupload dipendenza.

<dependency> 
    <groupId>commons-fileupload</groupId> 
    <artifactId>commons-fileupload</artifactId> 
    <version>1.3.1</version> 
</dependency> 
+0

In realtà questa configurazione è difettosa, il nome del bean dovrebbe essere 'multipartResolver' invece di' comonsMultipartResolver' se si desidera un'integrazione corretta con 'DispatcherServlet'. Anche il filtro non è obbligatorio (solo se lo stai combinando con Spring Security lo è). –

+0

In effetti non esiste una proprietà 'enabled' in quella classe, tuttavia la proprietà deve corrispondere a [this] (https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src /main/java/org/springframework/boot/autoconfigure/web/MultipartAutoConfiguration.java#L51) per abilitare/disabilitare la configurazione multipart. Quindi fondamentalmente considero un problema nella parte di configurazione multipart di Spring Boot. Inoltre, non tutte le proprietà devono avere una classe corrispondente da mappare, esistono anche altri mezzi per usare le proprietà definite nel file 'application.properties'. –

+0

Se si guarda la documentazione di Spring Boot http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html esiste una proprietà "multipart.enabled = true" e lì valore abilitato. Perché esiste se non è valido così? –

Problemi correlati