Я создаю микросервис с Java 8 и SpringBoot, это должно иметь следующий поток -
* Должны поддерживаться все типы документов MS Office - https://www.askingbox.com/info/mime-types-of-microsoft-office-file-formats Там перечислены 22 различных типа пантомимы.
Я добавил пользовательский 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, Spring жалуется:
No HttpMessageConverter for sun.nio.ch.ChannelInputStream and content type "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Кто-нибудь знает, как я могу заставить Spring вести себя и принимать типы mime MS: 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
и тип POJO, который был аннотирован @XmlRootElement
, и будет использовать JAXB для преобразования в обоих направлениях.
Как видите, для HttpMessageConverter
важны как тип mime, так и тип Java.
Сообщение об ошибке в вопросе определяет как тип mime, так и тип Java:
Тип пантомимы: 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
при отправке. Это будет передавать данные, используя меньше памяти. (Рекомендуемые)