Spring boot 在运行时将列表元素添加到Spring属性
我有一个Spring boot 在运行时将列表元素添加到Spring属性,spring-boot,spring-properties,Spring Boot,Spring Properties,我有一个application.yml文件,其中包含以下内容: topics: input: - name: topic1 partitions: 3 replicas: 1 - name: topic2 partitions: 6 replicas: 2 我希望能够在运行时更新或添加新的主题对象 我尝试了以下更新现有对象的方法: java -jar app.jar --topics.input[0].name="topicX
application.yml
文件,其中包含以下内容:
topics:
input:
- name: topic1
partitions: 3
replicas: 1
- name: topic2
partitions: 6
replicas: 2
我希望能够在运行时更新或添加新的主题对象
我尝试了以下更新现有对象的方法:
java -jar app.jar --topics.input[0].name="topicX"
以及将另一个对象添加到列表的以下步骤:
java -jar app.jar --topics.input[2].name="topicX" --topics.input[2].partitions=6 --topics.input[2].replicas=2
我通过以下方式访问这些属性:
@Component
@ConfigurationProperties(prefix = "topics")
@Validated
public class TopicsConfiguration {
@NotEmpty
@NotNull
private List<TopicConfiguration> input = new ArrayList<>();
public List<TopicConfiguration> getInputTopics() {
return input;
}
public void setFacts(List<TopicConfiguration> input) {
this.input = input;
}
}
我只想知道是否有任何方法可以在运行时更新或向列表中添加元素,这样我的项目的用户就不必修改
application.yml
,如果他们想更新此配置。那么您想在Spring Boot中重新加载应用程序.properties
或应用程序.yml
动态应用程序,而不必将另一个代码提交到另一个部署?如果我现在明白了这一点,那么你可以这样做
阅读这些链接,并在Spring Boot Actuator Reload Properties
或Spring Scheduling
上搜索更多信息。我们无法为您提供一个编写好的代码来实现这一点,但是有很多示例需要检查和尝试
链接:
如果我是你,我会更喜欢执行器方法,因为它可以避免混淆,而且更干净。好的,所以我做了一些研究和测试,并得出以下结论:
topics:
input:
- name: topic1
partitions: 3
replicas: 1
- name: topic2
partitions: 6
replicas: 2
您无法更新application.yml中定义的列表
如果您运行:
java -jar myApp.jar -my-list[2].name=foo
它将失败,因为一旦您想要传递列表,列表将覆盖application.yml中的当前列表,并且当索引0和1中没有任何内容时,您将尝试传递列表中的第三项
它不是一个动态列表,而是一个数组
您需要传递整个列表:
java -jar myApp.jar -my-list[0].name=foo -my-list[1].name=bar -my-list[2].name=foobar
因此,如果您要从cmd传入列表,您必须始终从头定义列表。向我们展示您用于更新列表的代码,如果您不发布为您提供NPE的代码,则很难帮助您……。代码发布在上面,java-jar app.jar--topics.input[0]。name=“topicX”
这就是我试图做到的。我没有试图在应用程序运行时更新列表,只是在我启动它时为它提供一个新值。是否要在属性文件中存储具有对象的动态可更新列表?直截了当地说,我认为这是没有功能的。你到底想让谁做那件事?这不是建筑的目的。也许我误用了它。我想这样做的原因是,我们只是给那些想运行我们服务的人一个Docker的形象。大多数用户只想听默认的卡夫卡主题,但有些用户可能需要听多个主题,因此这应该是一种让他们能够继续运行Docker映像的方式,同时提供更多的主题来听。好的,我会在一小时内回家后再研究这个问题,这样对其他情况会有所帮助,但就我而言,现在我不需要重新启动应用程序。我只需要在启动时提供一个命令行参数来修改属性。如第5.7节所述,一种方法是使用相应的application.yaml
(例如prod-application.yaml
,dev-application.yaml
等)创建弹簧配置文件