Spring Stream绑定到String而不是pojo

时间:2019-06-23 08:54:04

标签: spring-cloud spring-kafka spring-cloud-stream

我们刚刚将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子类化。

我们以前将它作为一个对象接收到使用者中(如果由于某种原因收到了错误的类,则编写日志),然后使用if(message instanceof MessageImpl){}

将其转换为相关的MessageImpl。

升级后,所有消息都绑定到String而不是它们的类。

我读到herecontent-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的实例(没有创建者,例如默认   构造,存在):无法从对象值反序列化(没有委托-   或基于资源的创作者)        在[来源:(byte [])

有什么想法要解决吗?

1 个答案:

答案 0 :(得分:0)

您从哪个版本升级?显示您的代码和配置属性。以前的版本默认情况下使用Kryo序列化,现在不推荐使用JSON,但是您的POJO必须是JSON友好的。

不建议使用Kryo序列化,但是您可以添加转换器。

请参见the documentation

  

提供的MessageConverters

     

如前所述,该框架已经提供了MessageConverters堆栈来处理最常见的用例。以下列表按优先级描述了提供的MessageConverters(使用了第一个有效的MessageConverter):

     
      
  1. ApplicationJsonMessageMarshallingConverter:org.springframework.messaging.converter.MappingJackson2MessageConverter的变体。在contentType为application / json(DEFAULT)的情况下,支持将消息的有效负载与POJO之间进行转换。

  2.   
  3. TupleJsonMessageConverter:已弃用支持将消息的有效负载与org.springframework.tuple.Tuple之间的转换。

  4.   
  5. ByteArrayMessageConverter:对于contentType为application / octet-stream的情况,支持将消息的有效负载从byte []转换为byte []。它本质上是一个传递,主要是为了向后兼容而存在。

  6.   
  7. ObjectStringMessageConverter:当contentType为text / plain时,支持将任何类型转换为String。它会调用Object的toString()方法,或者,如果有效载荷是byte [],则调用新的String(byte [])。

  8.   
  9. JavaSerializationMessageConverter:DEPRECATED当contentType为application / x-java-serialized-object时,支持基于Java序列化的转换。

  10.   
  11. KryoMessageConverter:已弃用当contentType为application / x-java-object时,支持基于Kryo序列化的转换。

  12.   
  13. JsonUnmarshallingConverter:类似于ApplicationJsonMessageMarshallingConverter。当contentType为application / x-java-object时,它支持任何类型的转换。它希望将实际的类型信息作为属性嵌入到contentType中(例如,application / x-java-object; type = foo.bar.Cat)。

  14.   
     

找不到合适的转换器时,框架将引发异常。发生这种情况时,您应该检查代码和配置,并确保您没有错过任何内容(即,确保使用绑定或标头提供了contentType)。但是,很可能您发现了一些不常见的情况(例如,可能是自定义的contentType),并且当前提供的MessageConverters堆栈不知道如何进行转换。在这种情况下,您可以添加自定义MessageConverter。请参阅用户定义的消息转换器。