Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将Spring Kafka消费者上接收到的JSON转换为准备保存在银行中的实体?_Java_Apache Kafka_Kafka Consumer Api_Spring Kafka - Fatal编程技术网

Java 如何将Spring Kafka消费者上接收到的JSON转换为准备保存在银行中的实体?

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

我需要使用Kafka主题中的JSON并转换为实体,这样我就可以保存到数据库Postgres,以防万一

用户配置:

@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)