2015-06-10 4 views
9

ich versucht hat CommonsMultipartResolver in Boot übersetzte meine alte Anwendung (IST) zu verwenden, um zu starten, und es hat jetzt den folgenden Code:Wie CommonsMultipartResolver im Frühjahr Stiefel zu verwenden

@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; 
     } 
    } 

Ist dies der richtige Weg in Boot, Ursache a Ich sah einige Eigenschaften in application.properties angewendet werden. Wären sie der gleiche Zweck als eine FilterRegistrationBean zu definieren?

# 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. 

Kann jemand irgendein Beispiel zur Verfügung stellen, wie man es benutzt? Vielen Dank.

By the way, es versucht, die Eigenschaft "multipart.enabled = true" zu setzen, und ich bekam:

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 

Antwort

2

Das war ein bug im Frühjahr Stiefel und wird in 1.2.5 festgelegt werden.

1

Erstens gibt keine ist Eigenschaft in org.springframework.boot.autoconfigure.web.MultipartProperties Klasse aktiviert.

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

Wenn Sie Sie Servlets 3 Behälter keine Notwendigkeit verwenden standardmäßig aktiviert commons-Fileupload-Mechanismus und Multipart-Unterstützung ist zu verwenden. Wenn Sie wollen keine mehrteiliger Standardkonfiguration keine Notwendigkeit fertigen jede config in application.properties auch hinzuzufügen.

<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:/"; 
} 

Wenn Sie commons-Fileupload dann Zugabe folgende Konfiguration funktioniert gut nutzen: wir

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; 
    } 
} 

Und natürlich müssen commons-Fileupload Abhängigkeit hinzuzufügen.

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

Eigentlich ist diese Konfiguration fehlerhaft, der Name der Bean sollte 'multipartResolver' anstelle von' comonsMultipartResolver' sein, wenn Sie eine korrekte Integration mit dem 'DispatcherServlet' wünschen. Auch der Filter ist nicht zwingend erforderlich (nur wenn Sie ihn mit Spring Security kombinieren). –

+0

Es gibt zwar keine 'enabled'-Eigenschaft in dieser Klasse, aber die Eigenschaft sollte [this] entsprechen (https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src /main/java/org/springframework/boot/autoconfigure/web/MultipartAutoConfiguration.java#L51) zu aktivieren/deaktivieren mehrteiliger Konfiguration. Im Grunde genommen halte ich das für ein Problem in der mehrteiligen Konfiguration von Spring Boot. Außerdem müssen nicht alle Eigenschaften eine entsprechende zuzuordnende Klasse haben. Es gibt auch andere Möglichkeiten, Eigenschaften zu verwenden, die in der Datei 'application.properties' definiert sind. –

+0

Wenn man sich bei Spring-Boot-Dokumentation http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html gibt es eine Eigenschaft „multipart.enabled = true“, und es sagt aktivierter Wert Warum existiert es, wenn es nicht so ist? –