【问题标题】:Spring MVC consume application/zipSpring MVC 使用应用程序/zip
【发布时间】:2015-12-10 00:05:18
【问题描述】:

我正在尝试将上传 zip 文件添加到我的 Spring REST API,但我不断收到无法使用 application/zip 的错误消息

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/zip' not supported

这是我在控制器中的功能,

@RequestMapping(value = "/zip", method = RequestMethod.POST, consumes = "application/zip")
public ResponseEntity<String> uploadZip(@RequestBody InputStream inputStream) {
    try {
        uploadZip(inputStream)
        return new ResponseEntity<String>(HttpStatus.CREATED);
    } catch (IOException e) {
        logger.warn("Error reading file", e);
        return new ResponseEntity<String>(HttpStatus.BAD_REQUEST);
    } catch (Exception e) {
        logger.error("Error creating new job", e);
        return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

是什么导致了这个异常?

【问题讨论】:

  • 你试过application/octet-stream吗?
  • 为什么您认为您的应用能够/应该能够使用压缩内容?
  • @SotiriosDelimanolis 我希望能够直接将 zip 上传到我的网络应用程序中。
  • 我得到你想要的。我在问你为什么认为你所拥有的应该工作?你做了什么来支持这个功能? (我基本上是在要求你展示你所做的研究,让你相信这会奏效。)
  • 另外,请澄清InputStream 参数应该是什么。它应该是原始请求正文内容吗?它应该是解压缩内容产生的流吗?还有什么?

标签: java spring-mvc zip


【解决方案1】:

给定@RequestBody 注解,Spring MVC 将使用RequestResponseBodyMethodProcessor 来解析调用方法的参数。这个HandlerMethodArgumentResolver 将尝试找到一个HttpMessageConverter,它可以解析application/zip 正文内容并生成InputStream 的某个子类型的实例。

没有这样的内置HttpMessageConverter 实现。您可以编写自己的实现并注册它。 Spring MVC 堆栈会拾取并使用它。

或者,如果您只想将请求的原始正文作为InputStream,只需删除@RequestBody 注释。 InputStream 是默认supported argument types 之一:

java.io.InputStream / java.io.Reader 用于访问请求的内容。该值是 Servlet API 公开的原始 InputStream/Reader

鉴于原始InputStream,您可以将其包装在ZipInputStream 中并自己解压缩。

另一种选择是编写和注册您自己的 HandlerMethodArgumentResolver 实现(查看参数注释或参数的实际类型),将请求的内容解压缩到某个对象中。


我的回答 here 更详细地解释了 Spring MVC 的 HandlerMethodArgumentResolver 模式。

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 2012-09-30
    • 1970-01-01
    • 2012-09-17
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多