PersonDeserializer在application.yml中配置为value-deserializer
,在deserialize
方法中,topicA
和topicB
均为空。
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
// ...
}
// ....
}
答案 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);
}