如何使用SpringBootRestTemplate将MicrosoftOfficeMIME类型作为内容类型头发送

0g0grzrc  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(510)

我正在用Java8和springboot构建一个微服务,它有以下流程-
将传入一个文件,文件名为guid,没有文件扩展名。
另一个xml文件将包含文件类型eg/xslx
文件类型是从xml中刮取的

  • 文件随后通过http post发送出去,主体作为文件负载,头“content type”包含mime类型。
  • 支持所有ms office文档类型-https://www.askingbox.com/info/mime-types-of-microsoft-office-file-formats 这里列出了22种不同的mime类型。

我已将自定义messageconverter添加到我的resttemplate中-

MediaType mt = new MediaType("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet");
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
ByteArrayHttpMessageConverter converter = new ByteArrayHttpMessageConverter();
converter.setSupportedMediaTypes(Collections.singletonList(mt));
messageConverters.add(converter);
restTemplate.setMessageConverters(messageConverters);

问题是springafaik不支持这些类型,因此mediatype.all将不包括这些类型。所以只要我加上

application/vnd.openxmlformats-officedocument.wordprocessingml.template

作为内容类型头,spring抱怨:

No HttpMessageConverter for sun.nio.ch.ChannelInputStream and content type "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

有没有人知道如何让spring表现出来并接受ms mime类型:https://www.askingbox.com/info/mime-types-of-microsoft-office-file-formats
谢谢

6mzjoqzu

6mzjoqzu1#

HttpMessageConverter 在字节数据和某个java对象之间进行转换。因此,它需要同时理解字节数据和java对象类型。字节数据的格式以mime类型给出。
HttpMessageConverter 例如,可以表示它支持 application/xml 以及 Document dom类型,并在一个方向转换时使用dom解析器,在另一个方向转换时使用xslt拷贝转换。
另一个 HttpMessageConverter 可能表示它支持 application/xml 以及一个用 @XmlRootElement ,并将使用jaxb在两个方向上进行转换。
如您所见,mime类型和java类型对于 HttpMessageConverter .
问题中的错误消息同时标识mime类型和java类型:
mime类型: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet java类型: sun.nio.ch.ChannelInputStream 问题是,尽管您的自定义消息转换器已配置为支持所讨论的mime类型,但您使用了 ByteArrayHttpMessageConverter ,它只支持 byte[] 作为java类型(请参阅消息转换器类的名称)。
因为java类型是 ChannelInputStream ,该自定义消息转换器不适用,并且由于没有其他消息转换器支持mime/java类型组合,因此会出现该错误。
我看到两个相当简单的解决方案:
ChannelInputStream 变成一个 byte[] ,然后发送它而不是 ChannelInputStream 对象。
将自定义消息转换器更改为 ResourceHttpMessageConverter ,然后将 ChannelInputStream 中的对象 InputStreamResource 发送时。这将流式传输数据,使用更少的内存((推荐)

相关问题