如何将 Microsoft Office Mime 类型作为 Content-Type header 与 Spring Boot RestTemplate 一起发送
How do I send Microsoft Office Mime Types as Content-Type header with with Spring Boot RestTemplate
我正在使用 Java 8 和 SpringBoot 构建微服务,
就是要有下面的流程-
- 将出现一个文件,名称为 GUID,没有文件扩展名。
- 另一个 xml 文件将包含文件类型 eg/ xslx
- 文件类型是从xml
中抓取的
- *文件然后通过 Http POST 发送出去,body 作为文件负载
和一个 header 'Content-Type' 包含 mime-type.
*将支持所有 MS Office 文档类型 - https://www.askingbox.com/info/mime-types-of-microsoft-office-file-formats
那里列出了 22 个不同的 mime-type。
我已将自定义 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);
问题是 Spring AFAIK 不支持任何这些类型,因此 MediaType.ALL 不会涵盖它们。
所以只要我添加类似
的内容
application/vnd.openxmlformats-officedocument.wordprocessingml.template
作为 Content-Type Header,
Spring 抱怨:
No HttpMessageConverter for sun.nio.ch.ChannelInputStream and content type "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
有没有人body知道如何让 Spring 表现出来并接受 MS mime 类型:https://www.askingbox.com/info/mime-types-of-microsoft-office-file-formats
谢谢
HttpMessageConverter
字节数据和某些 Java 对象之间的转换。因此,它需要了解字节数据 和 Java 对象类型。字节数据的格式以 mime 类型给出。
一个HttpMessageConverter
可以例如表明它支持 application/xml
和 Document
DOM 类型,并且在一个方向转换时会使用 DOM 解析器,在另一个方向转换时会使用 XSLT 复制转换.
然后另一个 HttpMessageConverter
可以表明它支持 application/xml
和一个用 @XmlRootElement
注释的 POJO 类型,并且会使用 JAXB 进行双向转换。
如您所见,mime 类型和 Java 类型对 HttpMessageConverter
都很重要。
问题中的错误消息标识了 MIME 类型和 Java 类型:
Mime 类型:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Java 类型:sun.nio.ch.ChannelInputStream
问题是,虽然您的自定义消息转换器已配置为说它支持有问题的 MIME 类型,但您使用了 ByteArrayHttpMessageConverter
,并且它仅支持 byte[]
作为 Java 键入 (请参阅消息转换器的名称 class).
由于Java类型是ChannelInputStream
,自定义消息转换器不适用,并且由于没有其他消息转换器支持mime/java类型组合,你得到错误。
我看到两个相当简单的解决方案:
将数据从 ChannelInputStream
加载到 byte[]
,然后发送它而不是 ChannelInputStream
对象。
将自定义消息转换器更改为 ResourceHttpMessageConverter
,然后在发送时将 ChannelInputStream
对象包装在 InputStreamResource
中。这将流式传输数据,使用更少的内存。 (推荐)
我正在使用 Java 8 和 SpringBoot 构建微服务, 就是要有下面的流程-
- 将出现一个文件,名称为 GUID,没有文件扩展名。
- 另一个 xml 文件将包含文件类型 eg/ xslx
- 文件类型是从xml 中抓取的
- *文件然后通过 Http POST 发送出去,body 作为文件负载 和一个 header 'Content-Type' 包含 mime-type.
*将支持所有 MS Office 文档类型 - https://www.askingbox.com/info/mime-types-of-microsoft-office-file-formats 那里列出了 22 个不同的 mime-type。
我已将自定义 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);
问题是 Spring AFAIK 不支持任何这些类型,因此 MediaType.ALL 不会涵盖它们。 所以只要我添加类似
的内容application/vnd.openxmlformats-officedocument.wordprocessingml.template
作为 Content-Type Header, Spring 抱怨:
No HttpMessageConverter for sun.nio.ch.ChannelInputStream and content type "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
有没有人body知道如何让 Spring 表现出来并接受 MS mime 类型:https://www.askingbox.com/info/mime-types-of-microsoft-office-file-formats
谢谢
HttpMessageConverter
字节数据和某些 Java 对象之间的转换。因此,它需要了解字节数据 和 Java 对象类型。字节数据的格式以 mime 类型给出。
一个HttpMessageConverter
可以例如表明它支持 application/xml
和 Document
DOM 类型,并且在一个方向转换时会使用 DOM 解析器,在另一个方向转换时会使用 XSLT 复制转换.
然后另一个 HttpMessageConverter
可以表明它支持 application/xml
和一个用 @XmlRootElement
注释的 POJO 类型,并且会使用 JAXB 进行双向转换。
如您所见,mime 类型和 Java 类型对 HttpMessageConverter
都很重要。
问题中的错误消息标识了 MIME 类型和 Java 类型:
Mime 类型:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Java 类型:
sun.nio.ch.ChannelInputStream
问题是,虽然您的自定义消息转换器已配置为说它支持有问题的 MIME 类型,但您使用了 ByteArrayHttpMessageConverter
,并且它仅支持 byte[]
作为 Java 键入 (请参阅消息转换器的名称 class).
由于Java类型是ChannelInputStream
,自定义消息转换器不适用,并且由于没有其他消息转换器支持mime/java类型组合,你得到错误。
我看到两个相当简单的解决方案:
将数据从
ChannelInputStream
加载到byte[]
,然后发送它而不是ChannelInputStream
对象。将自定义消息转换器更改为
ResourceHttpMessageConverter
,然后在发送时将ChannelInputStream
对象包装在InputStreamResource
中。这将流式传输数据,使用更少的内存。 (推荐)