Весенний ручей привязывается к String вместо того, чтобы pojo - PullRequest
0 голосов
/ 23 июня 2019

Мы только что обновили нашу Spring до:

Spring boot: 2.1.0.RELEASE

Spring cloud: Greenwich.SR1

Spring integration kafka: 3.1.0.RELEASE

Spring kafka: 2.2.7.RELEASE

и используем

Kafka 2.1.1

У нас есть тема, котораяболее одного типа экземпляров классов могут быть отправлены в один и тот же абстрактный класс.Давайте рассмотрим абстрактный класс с именем AbstractMessage и перейдем к подклассам MessageImpl1 и MessageImpl2.

Мы привыкли получать его в приемнике как объект (для записи журнала, если ошибочный класс каким-то образом получен), а затемприведите его к соответствующему MessageImpl, используя if(message instanceof MessageImpl){}

. После обновления все сообщения были привязаны к строке, а не к их классам.

Я читаю здесь , что content-type=application/json связывается с pojo, но даже при добавлении как на входе, так и на выходе он был связан со строкой:

spring.cloud.stream.bindings.input.contentType=application/json
spring.cloud.stream.bindings.output.contentType=application/json

Попытка получить MessageImpl напрямую вызвала эту ошибку:

Причина: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Невозможно создать экземпляр MessageImpl1 (без создателей, как конструкция по умолчанию, существует): не может десериализовать из значения объекта (без создателя на основе делегатов или свойств) в [Source: (byte [])

Есть идеи, как это исправить?

1 Ответ

0 голосов
/ 23 июня 2019

С какой версии вы обновились?Покажите свой код и свойства конфигурации.В предыдущих версиях по умолчанию использовалась сериализация Kryo, которая в настоящее время не поддерживается JSON, но ваши POJO должны быть удобны для json.

Сериализация Kryo устарела, но вы можете добавить конвертер.

См. документацию .

Предоставленные конвертеры сообщений

Как упоминалось ранее, платформа уже предоставляет стекMessageConverters для обработки наиболее распространенных случаев использования.В следующем списке описаны предоставляемые MessageConverters в порядке приоритета (используется первый работающий MessageConverter):

  1. ApplicationJsonMessageMarshallingConverter: изменение org.springframework.messaging.converter.MappingJackson2MessageConverter.Поддерживает преобразование полезной нагрузки сообщения в / из POJO для случаев, когда contentType является application / json (DEFAULT).

  2. TupleJsonMessageConverter: DEPRECATED Поддерживает преобразование полезной нагрузки сообщения в / изorg.springframework.tuple.Tuple.

  3. ByteArrayMessageConverter: Поддерживает преобразование полезной нагрузки сообщения из byte [] в byte [] для случаев, когда contentType является application / octet-stream.По сути, это проход и существует в основном для обратной совместимости.

  4. ObjectStringMessageConverter: Поддерживает преобразование любого типа в String, когда contentType имеет значение text / plain.Он вызывает метод toString () объекта или, если полезной нагрузкой является byte [], новую строку (byte []).

  5. JavaSerializationMessageConverter: DEPRECATED Поддерживает преобразование на основе сериализации Java, когда contentType имеет значениеapplication / x-java-serialized-object.

  6. KryoMessageConverter: DEPRECATED Поддерживает преобразование на основе сериализации Kryo, когда contentType является application / x-java-object.

  7. JsonUnmarshallingConverter: аналогичен ApplicationJsonMessageMarshallingConverter.Он поддерживает преобразование любого типа, когда contentType является application / x-java-object.Ожидается, что фактическая информация о типе будет встроена в contentType как атрибут (например, application / x-java-object; type = foo.bar.Cat).

Когда нетсоответствующий конвертер найден, фреймворк выдает исключение.Когда это происходит, вы должны проверить свой код и конфигурацию и убедиться, что вы ничего не пропустили (то есть убедитесь, что вы указали contentType с помощью привязки или заголовка).Однако, скорее всего, вы обнаружили какой-то необычный случай (например, пользовательский contentType), и текущий стек предоставленных MessageConverters не знает, как преобразовать.Если это так, вы можете добавить собственный MessageConverter.См. Пользовательские конвертеры сообщений.

...