对于我的Spring Boot应用程序,我尝试使用一个环境变量,该变量在application.yml
中保存properties.topics
的列表(请参阅下面的配置)。
properties:
topics:
- topic-01
- topic-02
- topic-03
我使用配置文件来填充properties bean(请参阅这个Spring文档),如下所示
import java.util.ArrayList;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("properties")
public class ApplicationProperties {
private List<String> topics = new ArrayList<>();
public void setTopics(List<String> topics) {
this.topics = topics;
}
public List<String> getTopics() {
return this.topics;
}
}
通过使用环境变量,我可以在不更改application.yml
的情况下更改列表的内容。然而,到目前为止,我能找到的所有例子都只适用于环境变量只保存单个值的情况,而不是我的情况下的值集合。
- 编辑:**
在@vancleff的评论之后,为了说明这一点,我不需要将环境变量的值保存到application.yml
。
- 另一编辑:**
我想我的问题过于简单化了,我搬起石头砸了自己的脚。@LppEdd的答案与我问题中给出的例子很好地结合在一起。但是,如果我需要的不是简单的字符串主题名称的集合,而是更复杂的结构,会发生什么情况呢?例如,类似于
properties:
topics:
-
name: topic-01
id: id-1
-
name: topic-02
id: id-2
-
name: topic-03
id: id-3
5条答案
按热度按时间slmsl1lt1#
有点晚了,但我也面临着同样的问题,这解决了它
https://github.com/spring-projects/spring-boot/wiki/Relaxed-Binding-2.0#lists-1
所以,对于问题中的例子:
环境变量应该如下所示:
wnrlj8wa2#
建议,不要太复杂。
假设您希望将该列表作为
Environment
变量。你会用然后可以使用注入的
Environment
Bean恢复它,并创建一个新的List<String>
Bean从现在开始,
List
可以是@Autowired
。您还可以考虑创建自定义限定符注解,比如
@Topics
。然后,
甚至
您可以使用外部化的文件。
将该文件的路径传递给环境参数。
而不是使用
Environment
Bean来恢复该路径。读取文件内容并要求Jackson
将其反序列化您还需要创建一个简单的
Topic
类,它表示此
JSON
数组的元素。djmepvbi3#
vuv7lop34#
还有一种解决这个问题的方法,它在解析中更丑陋,但非常容易并且有效。替换:
有:
然后这样读:
请注意,我假设ID和Topic必须一起使用,并且顺序相同。
vbopmzt15#
我建立了一个快速的小工具来做这件事。
您可以修改它,而不需要太多更改,以支持多个字段。我见过从属性加载数据库配置数组时所做的类似事情。