首页 > 解决方案 > Spring Boot 属性 yaml

问题描述

我使用自动配置(仅通过注释)运行 spring boot 和 kafka,并在 .yaml 文件中定义了道具,即:

spring:
  kafka:
    bootstrap-servers: someserver:9999
    consumer:
      group-id: mygroup
....

 @KafkaListener()
  public void receive(ConsumerRecord<?, ?> consumerRecord) {
....
  }

它工作正常,弹簧映射,即正确的字段组ID。

但是当我尝试使用相同的yaml文件手动配置kafka(使用ConsumerFactory和ConsumerConfig)时,我遇到了问题。在类 ConsumerConfig 中,kafka 属性以 . 名义上,而不是_即:

public static final String GROUP_ID_CONFIG = "group.id";

所以我不能只是将它们加载到地图中并将地图传递给 ConsumerFactory 因为键与 _ not 。

我不想像 spring kafka 团队提供的示例中所示的那样丑陋,当他们将 yaml 中的道具映射到配置类中,然后在映射中手动分配道具以传递给工厂时:

@ConfigurationProperties(prefix = "kafka")
public class ConfigProperties {

    private String brokerAddress;

    private String topic;

    private String fooTopic;

    public String getBrokerAddress() {
        return this.brokerAddress;
    }

.....

    @Bean
    public ProducerFactory<String, String> producerFactory() {
        Map<String, Object> props = new HashMap<>();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, this.configProperties.getBrokerAddress());
    .....

        return new DefaultKafkaProducerFactory<>(props);
    }

标签: springspring-bootyamlspring-kafka

解决方案


如果要使用 yml 文件中的点属性,则需要像 boot 对不直接支持作为引导属性的任意属性执行此操作:

spring:
  kafka:
    consumer:
      properties:
        group.id: foo

即填充Properties属性。

boot 为某些属性提供一流支持的原因是,IDE 编辑器可以提供内容辅助,这对于任意属性是不可能的。


推荐阅读