自定义Kafka解串器上的@Value null

时间:2018-10-12 06:15:58

标签: java spring spring-boot spring-kafka

PersonDeserializer在application.yml中配置为value-deserializer,在deserialize方法中,topicAtopicB均为空。

PersonDeserializer.java:

@Component
public class PersonDeserializer implements Deserializer<Person> {

    @Value("${app.topicA}")
    private String topicA;

    @Value("${app.topicB}")
    private String topicB;

    @Override
    public Person deserialize(String topic, byte[] data) {
        // topicA == null, topicB == null
        // ...
    }

    // ....
}

1 个答案:

答案 0 :(得分:0)

application.yml中指定时,Kafka创建对象,而不是Spring。卡夫卡对@Value一无所知。

您需要Spring来创建反序列化器,然后将其直接注入消费类工厂。参见the documentation

  

重要

     

只能通过属性执行简单的配置。对于更高级的配置(例如,在序列化器/反序列化器中使用自定义ObjectMapper),应使用接受预先构建的序列化器和反序列化器的生产者/消费者工厂构造函数。例如,使用Spring Boot覆盖默认工厂:

@Bean
public ConsumerFactory<Foo, Bar> kafkaConsumerFactory(KafkaProperties properties,
    JsonDeserializer customDeserializer) {

    return new DefaultKafkaConsumerFactory<>(properties.buildConsumerProperties(),
        customDeserializer, customDeserializer);
}

@Bean
public ProducererFactory<Foo, Bar> kafkaProducerFactory(KafkaProperties properties,
    JsonSserializer customSerializer) {

    return new DefaultKafkaConsumerFactory<>(properties.buildProducerProperties(),
        customSerializer, customSerializer);
}