Java 如何在Spring引导中使用CommonsMultipartResolver

Java 如何在Spring引导中使用CommonsMultipartResolver,java,spring,spring-boot,apache-commons,Java,Spring,Spring Boot,Apache Commons,我曾尝试在引导中使用CommonsMultipartResolver将我的旧应用程序(WAR)转换为引导,现在它得到了以下代码: @Configuration public class TestConfig { @Bean public FilterRegistrationBean openEntityManagerFilterRegistrationBean() { // Set upload filter

我曾尝试在引导中使用CommonsMultipartResolver将我的旧应用程序(WAR)转换为引导,现在它得到了以下代码:

@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;
        }
    }
这是引导的正确方式吗?因为我在application.properties中看到了一些属性。它们的用途是否与定义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.
有谁能提供一些样品来说明如何使用它吗?谢谢

顺便说一下,它试图设置属性“multipart.enabled=true”,我得到:

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

首先,在
org.springframework.boot.autoconfigure.web.MultipartProperties
类中没有启用的属性

提及

如果您使用的是Servlet3容器,则无需使用commons文件上载机制,并且默认情况下启用了多部分支持。如果不想自定义任何多部分默认配置,也不需要在
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:/";
}
当然,我们需要添加commons文件上传依赖项

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

文件上传
文件上传
1.3.1

这是Spring引导中的一个问题,将在1.2.5中修复。

如果要使用
CommonsMultipartFile
上载文件,请在Spring引导项目中添加
@EnableAutoConfiguration(exclude={multipartutoconfiguration.class})
。禁用spring boot中的多部件配置

   public RespDataView provisionalMediaUpload(@RequestParam("file") CommonsMultipartFile file,
                                               @RequestParam("type") String type) {}

实际上,该配置是有缺陷的,如果希望与DispatcherServlet进行适当集成,bean的名称应该是
multipartResolver
,而不是
comonsMultipartResolver
。此外,该筛选器不是必需的(仅当您将其与Spring Security结合使用时)。该类中确实没有启用的
属性
,但是该属性应匹配以启用/禁用多部分配置。因此,基本上我认为在Spring Bug的多部分配置部分中有一个问题。此外,并非所有属性都需要映射到相应的类,还有其他使用
application.properties
文件中定义的属性的方法。如果您查看Spring引导文档,其中有一个属性“multipart.enabled=true”,并显示为enabled值。如果无效,它为什么会存在?因此,“multipart.enabled=false”用于禁用引导的多部分自动配置
   public RespDataView provisionalMediaUpload(@RequestParam("file") CommonsMultipartFile file,
                                               @RequestParam("type") String type) {}