从名为yaml属性列表中读取字符串数组作为常量?

时间:2017-08-11 18:00:26

标签: java spring spring-boot yaml spring-kafka

Spring Java是否可以从YAML文件中的命名值映射中读取字符串数组作为常量(特别是与Spring-Kafka中的@KafkaListener注释一起使用)?

   a:
     b:
       topics:
         foo: FooTopic
         bar: BarTopic

会导致常数= ['FooTopic','BarTopic']。

我假设它与评估列表的表达式类似,就像[Reading a List from properties file and load with spring annotation @Value]中的一些示例一样。我只是不确定语法可能是什么,因为我看到的唯一方法是使用多个注释来构造像[Reading a map from yaml in Java getting null]这样的POJO,它在@KafkaListener注释上下文中不起作用

注意:主题需要命名,因为它们是在不同的上下文中单独提取的。

编辑:拼写

1 个答案:

答案 0 :(得分:1)

如果不提取@ConfigurationProperties,它就无法正常工作。

这是我额头上的内容:

@KafkaListener(topics = {"${kafka.topics.foo}", "${kafka.topics.bar}"})

但与此同时:

@ConfigurationProperties("kafka")
public class KafkaAppProperties {

    private Map<String, String> topics  = new HashMap<>();

    public Map<String, String> getTopics() {
        return this.topics;
    }

}

我能做到:

 @KafkaListener(topics = "#{@'kafka-org.springframework.integration.samples.kafka.KafkaAppProperties'.topics.values()}")

是的,KafkaAppProperties的bean名称看起来很尴尬,但我们可以用人工豆来克服它:

@Autowired
private KafkaAppProperties properties;

@Bean
public Map<String, String> kafkaTopic() {
    return this.properties.getTopics();
}

...

@KafkaListener(topics = "#{@kafkaTopic.values()}")
public void handle(Object record) {
    ...
}