Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 在运行时将列表元素添加到Spring属性_Spring Boot_Spring Properties - Fatal编程技术网

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
    等)创建弹簧配置文件