@ Значение NULL на кастомном десериализаторе Kafka - PullRequest
0 голосов
/ 12 октября 2018

PersonDeserializer настроен как value-deserializer в application.yml, а в методе 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
        // ...
    }

    // ....
}

1 Ответ

0 голосов
/ 12 октября 2018

Когда указано в application.yml, Кафка создает объекты, а не Spring.Кафка ничего не знает о @Value.

. Вам нужен Spring, чтобы создать десериализатор и внедрить его непосредственно на потребительскую фабрику.См. документацию .

Важно

Только свойства могут быть выполнены с простой настройкой;для более сложной конфигурации (например, использование пользовательского 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);
}
...