我将下面的数据发布到kafka中,并通过spring集成渠道接收并转换为 Log 对象,我如何使用spring集成转换器将下面的数据转换为Log对象?感谢您的帮助
'Log(clientKey = string,有效负载= string)'
这是频道适配器代码
@Bean
public KafkaMessageDrivenChannelAdapter<String, String> kafkaMessageDrivenChannelAdapter() {
KafkaMessageDrivenChannelAdapter<String, String> kafkaMessageDrivenChannelAdapter = new KafkaMessageDrivenChannelAdapter<>(
kafkaListenerContainer());
kafkaMessageDrivenChannelAdapter.setPayloadType(Log.class);
kafkaMessageDrivenChannelAdapter.setOutputChannel(inputChannel());
return kafkaMessageDrivenChannelAdapter;
}
当我尝试使用以下内容在服务激活器中进行转换
ObjectMapper objectMapper = new ObjectMapper();
Log msg = objectMapper.readValue(arg0.getPayload().toString() , Log.class);
失败的原因
com.fasterxml.jackson.core.JsonParseException:无法识别的令牌“ Log”:正在等待(“ true”,“ false”或“ null”)
答案 0 :(得分:2)
首先,'Log(clientKey=string, payload=string)'
看起来不像格式正确的JSON,因为您希望在以后的Spring Integration中进行转换。
您的另一个担心kafkaMessageDrivenChannelAdapter.setPayloadType(Log.class);
。这样,您不需要任何下游转换,MessagingMessageConverter
中的IntegrationRecordMessageListener
将为我们完成转换工作。
但是,我们仍然需要有适当的数据才能进行转换。
您还需要记住,Apache Kafka具有自己的机制,可以从网络中反序列化byte[]
。有关转换和(反)序列化的更多信息,请参见Spring for Apache Kafka:https://docs.spring.io/spring-kafka/docs/current/reference/html/_reference.html#serdes
为了进行正确的JSON转换,Spring Integration提供了一个JsonToObjectTransformer
组件,可以与@Transformer
批注一起使用:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-transformation-chapter.html#_common_transformers
更新
@Transformer(inputChannel = "inputChannel", outputChannel = "processChannel")
@Bean
public JsonToObjectTransformer jsonToObjectTransformer() {
return new JsonToObjectTransformer(Log.class);
}