Java 如何将Spring Kafka消费者上接收到的JSON转换为准备保存在银行中的实体?
我需要使用Kafka主题中的JSON并转换为实体,这样我就可以保存到数据库Postgres,以防万一 用户配置:Java 如何将Spring Kafka消费者上接收到的JSON转换为准备保存在银行中的实体?,java,apache-kafka,kafka-consumer-api,spring-kafka,Java,Apache Kafka,Kafka Consumer Api,Spring Kafka,我需要使用Kafka主题中的JSON并转换为实体,这样我就可以保存到数据库Postgres,以防万一 用户配置: @Configuration @EnableKafka public class ConsumerConfiguration { @Value("${spring.kafka.bootstrap-servers}") private String bootstrapServers; @Bean public Map<String, Object
@Configuration
@EnableKafka
public class ConsumerConfiguration {
@Value("${spring.kafka.bootstrap-servers}")
private String bootstrapServers;
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> properties = new HashMap<>();
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
properties.put(JsonSerializer.ADD_TYPE_INFO_HEADERS, false);
properties.put(ConsumerConfig.GROUP_ID_CONFIG, "Kafka");
return properties;
}
@Bean
public ConsumerFactory<String, String> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(consumerConfigs(),
new StringDeserializer(),
new JsonDeserializer<>(String.class));
}
@Bean
public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>>
kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory =
new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}
@Bean
public EventConsumer consumer() {
return new EventConsumer();
}
}
部分实体类
@lombok.Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "ENTIDADES_COMERCIAIS")
@Builder
public class EntidadesComerciais {
@Id
@Column(name = "CODIGO_DA_ENTIDADE_COMERCIAL")
private Long codigoDaEntidadeComercial;
@Column(name = "NOME_DA_ENTIDADE_COMERCIAL")
private String nomeDaEntidadeComercial;
@Column(name = "NOME_COMERCIAL")
private String nomeComercial;
@Column(name = "TIPO_DA_ENTIDADE_COMERCIAL")
private String tipoDaEntidadeComercial;
...
我用的是弹簧卡夫卡和Postgres。程序启动时,我收到以下异常:
org.springframework.kafka.listener.ListenerExecutionFailedException: Listener method could not be invoked with the incoming message
Endpoint handler details:
Method [public void br.com.dchristofolli.kafka.EventConsumer.kafkaConsumer(br.com.dchristofolli.kafka.entity.EntidadesComerciais)]
Bean [EventConsumer(entidadeComercialRepository=null, latch=java.util.concurrent.CountDownLatch@144e36ae[Count = 1])]; nested exception is org.springframework.messaging.converter.MessageConversionException: Cannot handle message; nested exception is org.springframework.messaging.converter.MessageConversionException: Cannot convert from [java.lang.String] to [br.com.dchristofolli.kafka.entity.EntidadesComerciais] for GenericMessage [payload={"topic":"ENTIDADES_COMERCIAIS"...
我需要知道我做错了什么,或者我是否需要修改代码的任何部分,以便能够转换我的实体ENTIDADES\u COMERCIAIS
中接收到的有效负载,感谢任何能够帮助我的人
无法从[java.lang.String]转换为[br.com.dchristofoli.kafka.entity.EntidadesComerciais]
您正在告诉反序列化程序创建一个字符串,而不是EntidadesComerciais
new JsonDeserializer<>(String.class)
新的JsonDeserializer(String.class)
您可以共享一个示例负载吗?我想关键应该是新的JsonDeserializer()
而不是新的StringDeserializer()
。这取决于键的类型;如果它是字符串,则StringSerializer
是正确的。如果它是复杂对象,则可能需要JSON。我之所以这样认为是因为此配置:properties.put(ConsumerConfig.key\u反序列化程序\u CLASS\u config,JsonDeserializer.CLASS)
Ah-我没有注意到;当您向构造函数添加具体实例时,这些属性会被忽略。您应该以一种或另一种方式进行配置,以避免混淆。要配置默认类,您可以使用JsonDeserializer.VALUE\u default\u TYPE
。
new JsonDeserializer<>(String.class)