我们刚刚将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){}
升级后,所有消息都绑定到String而不是它们的类。
我读到here,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
的实例(没有创建者,例如默认 构造,存在):无法从对象值反序列化(没有委托- 或基于资源的创作者) 在[来源:(byte [])
有什么想法要解决吗?
答案 0 :(得分:0)
您从哪个版本升级?显示您的代码和配置属性。以前的版本默认情况下使用Kryo序列化,现在不推荐使用JSON,但是您的POJO必须是JSON友好的。
不建议使用Kryo序列化,但是您可以添加转换器。
提供的MessageConverters
如前所述,该框架已经提供了MessageConverters堆栈来处理最常见的用例。以下列表按优先级描述了提供的MessageConverters(使用了第一个有效的MessageConverter):
ApplicationJsonMessageMarshallingConverter:org.springframework.messaging.converter.MappingJackson2MessageConverter的变体。在contentType为application / json(DEFAULT)的情况下,支持将消息的有效负载与POJO之间进行转换。
TupleJsonMessageConverter:已弃用支持将消息的有效负载与org.springframework.tuple.Tuple之间的转换。
ByteArrayMessageConverter:对于contentType为application / octet-stream的情况,支持将消息的有效负载从byte []转换为byte []。它本质上是一个传递,主要是为了向后兼容而存在。
ObjectStringMessageConverter:当contentType为text / plain时,支持将任何类型转换为String。它会调用Object的toString()方法,或者,如果有效载荷是byte [],则调用新的String(byte [])。
JavaSerializationMessageConverter:DEPRECATED当contentType为application / x-java-serialized-object时,支持基于Java序列化的转换。
KryoMessageConverter:已弃用当contentType为application / x-java-object时,支持基于Kryo序列化的转换。
JsonUnmarshallingConverter:类似于ApplicationJsonMessageMarshallingConverter。当contentType为application / x-java-object时,它支持任何类型的转换。它希望将实际的类型信息作为属性嵌入到contentType中(例如,application / x-java-object; type = foo.bar.Cat)。
找不到合适的转换器时,框架将引发异常。发生这种情况时,您应该检查代码和配置,并确保您没有错过任何内容(即,确保使用绑定或标头提供了contentType)。但是,很可能您发现了一些不常见的情况(例如,可能是自定义的contentType),并且当前提供的MessageConverters堆栈不知道如何进行转换。在这种情况下,您可以添加自定义MessageConverter。请参阅用户定义的消息转换器。