Добавить элемент списка в свойства Spring во время выполнения - PullRequest
0 голосов
/ 09 июля 2019

У меня есть 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;
  }

}

Где TopicConfiguration - это просто POJO с перечисленными 3 полями.

Когда я не пытаюсь изменить какой-либо объект свойства во время выполнения, это работает точно так, как я ожидаю, однако я могуне обновлять список свойств вообще.Когда я пытаюсь обновить существующий объект, я получаю NPE.Когда я пытаюсь добавить новый объект в список, я получаю:

Property: topics.input[2].name
    Value: lmnop
    Origin: "topics.input[2].name" from property source "commandLineArgs"
    Reason: The elements [topics.input[2].name,topics.input[2].partitions,topics.input[2].replicas] were left unbound.

Я просто хотел бы знать, есть ли способ обновить или добавить элемент в список во время выполнения, чтобы пользователи моегопроекту не нужно изменять application.yml, если они хотят обновить эту конфигурацию.

Ответы [ 2 ]

1 голос
/ 09 июля 2019

хорошо, поэтому я провел некоторое исследование и некоторое тестирование и придумал следующее:

вы не можете обновить определенный список в 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, вы всегда должны определять список с нуля.

0 голосов
/ 09 июля 2019

Таким образом, вы хотите перезагрузить application.properties или application.yml в приложении Spring Boot на лету, не заставляя другой код фиксировать другое развертывание? Если я правильно понял, то вот как вы можете это сделать.

Прочитайте эти ссылки, а также Google больше на Spring Boot Actuator Reload Properties или Spring Scheduling. Мы не можем предоставить вам написанный код, чтобы это сработало, но есть множество примеров, которые можно изучить и опробовать.

Ссылки:

  1. Обновление привода
  2. Планирование пружин

На вашем месте я бы предпочел метод Actuator, поскольку он позволяет избежать путаницы и является более чистым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...