Как отправить типы Microsoft Office Mime в качестве заголовка Content-Type с Spring Boot RestTemplate

Я создаю микросервис с Java 8 и SpringBoot, это должно иметь следующий поток -

  1. Появится файл с GUID в качестве имени и без расширения файла.
  2. Появится другой файл xml, содержащий тип файла, например, / xslx
  3. Тип файла взят из xml
  4. Затем * файл отправляется по Http POST с телом в качестве полезной нагрузки файла. и заголовок «Content-Type», содержащий MIME-тип.

* Должны поддерживаться все типы документов 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

Спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
884
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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, вы получаете эту ошибку.

Я вижу два довольно простых решения:

  1. Загрузите данные из ChannelInputStream в byte[], а затем отправьте их вместо объекта ChannelInputStream.

  2. Измените пользовательский конвертер сообщений на ResourceHttpMessageConverter, а затем заверните объект ChannelInputStream в InputStreamResource при отправке. Это будет передавать данные, используя меньше памяти. (Рекомендуемые)

Другие вопросы по теме