Search code examples
javaspring-bootjavabeansspring-kafka

Spring Boot: read from yaml using @ConfigurationProperties not working with @Data


I am trying to retrieve value from application.yml. The final line below is showing kafkaConfig as null, and cannot read. How do I setup the Kafka Config and code properly, to read from the json file? We are using @Data instead of getters/setters.

KafkaConfig.java

@Configuration
@ConfigurationProperties("kafka")
@Data
public class KafkaConfig {
    private String topic;
    private String event;
}

Application.yml

kafka:
  topic: "testTopic"
  event: "testEvent"

KafkaProducerBeans.java

@Component
public class KafkaProducerBeans {

    @Autowired
    private KafkaConfig kafkaConfig;

    public KafkaProducerBeans(KafkaConfig kafkaConfig) {
        this.kafkaConfig = kafkaConfig;
    }

    @Bean(name = "kafkaTestClient")
    public String getData() {
        return kafkaConfig.getTopic();  // final line is creating null for kafka Config
    }

Resource: https://codingnconcepts.com/spring-boot/spring-configuration-properties-using-yml/


Solution

  • I think the recommended way of binding properties to pojos is to use the @EnableConfigurationProperties annotation like so:

    KafkaConfig.java

    @ConfigurationProperties("kafka")
    @Data
    public class KafkaConfig {
        private String topic;
        private String event;
    }
    

    KafkaProducerBeans.java

    @Component
    @EnableConfigurationProperties(KafkaConfig.class)
    public class KafkaProducerBeans {
    
        private final KafkaConfig kafkaConfig;
    
        @Autowired
        public KafkaProducerBeans(KafkaConfig kafkaConfig) {
            this.kafkaConfig = kafkaConfig;
        }
    
        // [...]
    }
    

    Refer to the official Spring Documentation for further details: