带有 Spring Boot Rest 服务的 Multipart

Posted

技术标签:

【中文标题】带有 Spring Boot Rest 服务的 Multipart【英文标题】:Multipart with Spring Boot Rest Service 【发布时间】:2015-08-16 03:33:51 【问题描述】:

我有一个 REST-Service 定义如下

@RequestMapping(value = "/userId/profileimage/language", method = RequestMethod.PUT)
public String uploadProfileImage(@PathVariable String userId, @RequestParam MultipartFile file, @PathVariable String language) throws IOException  ...

并定义了一个多部分过滤器

@Bean
public FilterRegistrationBean multipartFilter() 
    FilterRegistrationBean filterRegBean = new FilterRegistrationBean();
    filterRegBean.setFilter(new MultipartFilter());
    List<String> urlPatterns = new ArrayList<String>();
    urlPatterns.add("/*");
    filterRegBean.setUrlPatterns(urlPatterns);
    return filterRegBean;

还有一个 multipartConfigElement

@Bean
public MultipartConfigElement multipartConfigElement()
    MultipartConfigElement config = new MultipartConfigElement("");
    return config;

但是当我向 REST 服务发送多部分消息时,我仍然收到以下异常:

servlet [dispatcherServlet] 在路径 [/dev] 的上下文中的 Servlet.service() 引发异常 [请求处理失败;嵌套异常是 java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?]

该服务受 Spring Security 保护(作为辅助信息),Spring Boot 在启动时记录以下内容

添加了现有的过滤器初始化 bean 'multipartFilter'; order=2147483647,resource=class 路径资源[com/fl/wir/config/MvcConfigurations.class]

映射过滤器:'multipartFilter' 到 url:[/*]

多部分自动配置 - 找到@ConditionalOnClass 类:javax.servlet.Servlet,org.springframework.web.multipart.support.StandardServletMultipartResolver,javax.servlet.MultipartConfigElement (OnClassCondition) - 匹配(OnPropertyCondition)

DispatcherServletAutoConfiguration.DispatcherServletConfiguration#multipartResolver - @ConditionalOnMissingBean (names: multipartResolver; SearchStrategy: all) 找到以下 [multipartResolver] (OnBeanCondition)

知道为什么我仍然会收到异常吗? (使用 Spring-Boot 1.2.3.RELEASE)

【问题讨论】:

不要指定那些只是将appropriate properties 添加到application.properties。文件上传和 PUT 也不起作用,仅适用于 POST。 【参考方案1】:

您正在让它变得复杂,要启用文件上传,只需使用application.properties 中的properties 正确配置它。

multipart.enabled=true

并确保您的类路径中有spring-webmvc(从您已经使用的注释判断)。

但是还有另一件事,那就是文件上传将only work for POST 请求而不是任何其他请求,因此 PUT 将不起作用。

【讨论】:

主要问题是我使用了 PUT。 rest 开箱即用,但错误消息并没有真正帮助我找出答案。 支持PUT i-proving.com/2015/05/14/… 那将是 spring.servlet.multipart.enabled=true 对于 Spring Boot 2。

以上是关于带有 Spring Boot Rest 服务的 Multipart的主要内容,如果未能解决你的问题,请参考以下文章

在同一个 Spring Boot 应用程序中的 Rest 服务和 Web 服务

在带有 spring-boot rest 和 Swagger 的标头中使用 utf-8 字符时未加载响应

带有 Spring Boot REST 控制器和 JSON 的空字段

Angular 2 + CORS + 带有 Spring Security 的 Spring Boot Rest Controller

在 Spring Boot + Spring Data Rest 中反序列化时忽略带有 @JsonProperty 的字段

如何将 Spring Boot Rest 服务和 Angular App 捆绑在一个 war 文件中