Spring Boot - YML config - Стереть запись при объединении - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть базовая конфигурация YML для моего приложения в пути к классам, который выглядит следующим образом:

hello-world:
  values:
    bar:
      name: bar-name
      description: bar-description
    foo:
      name: foo-name
      description: foo-description

hello-world содержит карту из строки в POJO, называемую значениями. Я хочу переопределить настройки в hello-world, в частности я хочу удалить запись. Итак, в локальном каталоге, где я запускаю приложение, у меня есть этот application.yml:

hello-world:
  values:
    bar:
      name: bar-name
      description: bar-description

source: from-the-local-dir

Но это не работает, потому что, когда моя локальная конфигурация переопределяет существующую, карты объединяются в одну, и исходная запись "foo" сохраняется. Есть ли способ явно удалить записи из карты конфигурации весной yml?

PS: я вижу, что локальный файл поднят, изменив запись "bar" в локальном файле. Вот полный код, я добавил конфигурацию «source», чтобы сказать, какой файл был загружен последним:

@Import(PlayGround.Config.class)
@SpringBootApplication
public class PlayGround {

    @Autowired
    Config config;

    @Value("${source}")
    String source;

    public void start() {
        System.out.println(config);
        System.out.println(source);
    }

    public static void main(String[] args) {
        System.out.println(Arrays.toString(args));
        ConfigurableApplicationContext context = SpringApplication.run(PlayGround.class, args);
        PlayGround playGround = context.getBean(PlayGround.class);
        playGround.start();
    }

    @ConfigurationProperties(prefix = "hello-world")
    public static final class Config {
        Map<String, Information> values = new HashMap<String, Information>();

        public Map<String, Information> getValues() {
            return values;
        }

        public void setValues(Map<String, Information> values) {
            this.values = values;
        }

        @Override
        public String toString() {
            return MoreObjects.toStringHelper(this)
                    .add("values", values)
                    .toString();
        }
    }

    public static final class Information {

        String name;
        String description;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        @Override
        public String toString() {
            return MoreObjects.toStringHelper(this)
                    .add("name", name)
                    .add("description", description)
                    .toString();
        }
    }

}

1 Ответ

0 голосов
/ 07 ноября 2018

Spring boot по умолчанию берет файл из src / main / resource / application.yml Вы можете объявить config / application.yml, и эти настройки переопределят application.yml в src / main / resources

Вы можете просто попробовать src / main / resources / application.yml:

hello-world:
  bar: 
    name: bar-name
    description: bar-description
  foo: 
    name: foo-name
    description: foo-description

И config / application.yml

  hello-world:
      bar: 
        name: bar-name
        description: bar-description

Я думаю, что это может помочь Поэтому, когда вы запустите ваше приложение, config / application.yml переопределит ваш существующий src / main / resources / application.yml

Вы можете полностью удалить hello-world из config / application.yml Но он выдаст исключение времени выполнения что-то вроде:

Could not resolve placeholder 'hello-world.foo' in value "${hello-world.foo}

Чтобы исправить это, вы можете применить значение инъекции, например: @Value ( "$ {hello-world.foo:}") где после ':' вы можете определить значение по умолчанию

Вы можете оставить в config / application.yml пустые поля

hello-world:
  bar: 
    name: bar-name
    description: bar-description
  foo: 
    name:
    description:

По умолчанию, если вы не укажете все значения в foo, они будут пустыми (''), а затем вы сможете фильтровать и удалять записи с пустыми значениями на вашей карте. Также вы можете посмотреть в этом классе:

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/YamlProcessor.ResolutionMethod.html

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