【问题标题】:Spring Boot: read from yaml using @ConfigurationProperties not working with @DataSpring Boot:使用 @ConfigurationProperties 从 yaml 读取不与 @Data 一起使用
【发布时间】:2021-11-22 13:09:08
【问题描述】:

我正在尝试从 application.yml 中检索值。下面的最后一行将 kafkaConfig 显示为 null,并且无法读取。如何正确设置 Kafka 配置和代码以从 json 文件中读取?我们正在使用 @Data 而不是 getter/setter。

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
    }

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

【问题讨论】:

  • 确保在您的主助推类上您使用的是@SpringBootApplication,它有@EnableAutoConfiguration,这有助于自动启用您的配置,否则您需要使用@EnableConfigurationProperties 来明确启用它。
  • 与其定义这些属性,不如阅读spring-kafka config - docs.spring.io/spring-boot/docs/current/reference/html/…上的文档
  • 是的@OneCricketeer 我们公司正在使用 Kafka 包装器,所以他们希望我以这种方式使用它

标签: java spring-boot javabeans spring-kafka


【解决方案1】:

@ComponentScan(basePackages ="PATH" )

PATH:你希望它查找的包路径

@ComponentScan(basePackages ="PATH" )
@Configuration
@Import(value = {
    KafkaProducerBeans.class
})
public class AppConfig{

}

【讨论】:

  • 在 App.config 类中执行此操作。将 KafkaConfig 类导入 App.config 类。
【解决方案2】:

KafkaConfig类上再添加一个注解@EnableConfigurationProperties

KafkaConfig.java

@Configuration
@EnableConfigurationProperties    // new added annotation
@ConfigurationProperties("kafka")
@Data
public class KafkaConfig {
    private String topic;
    private String event;
}

【讨论】:

  • @EnableConfigurationProperties 不需要提及 Spring Boot 文档说,每个项目都会自动包含 @EnableConfigurationProperties. 因此,@ConfiguratonProperties 支持在每个 Spring Boot 应用程序中都隐式打开。
【解决方案3】:

我认为将属性绑定到 pojos 的推荐方法是使用 @EnableConfigurationProperties 注释,如下所示:

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;
    }

    // [...]
}

更多详细信息请参考官方 Spring 文档:

【讨论】:

    猜你喜欢
    • 2016-01-26
    • 2017-05-06
    • 2021-08-11
    • 2014-10-21
    • 2019-11-22
    • 1970-01-01
    • 2022-12-29
    • 2019-05-30
    • 2014-07-29
    相关资源
    最近更新 更多