Spring не принимает переменные среды

В моем проекте у меня есть отдельные файлы application.yml для каждой среды, внутри каждой папки для среды.

Spring не принимает переменные среды

ПРИМЕЧАНИЕ. Файл yml красного цвета создан временно, чтобы код работал. Но следует удалить это после исправления. Итак, я хочу использовать отдельный файл application.yml в зависимости от среды. Специально мне нужно использовать local/application.yml для локальной разработки

Ниже приведен пример получения переменных env в моем проекте.

@Component
@Configuration
public class ApplicationProperties {
    @Value("${ex.my.url}")
    private String myServiceUrl;
   // getters setters and nedded stuff
}

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

Любое решение проблемы?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
518
4

Ответы 4

в своих проектах я указываю профиль с опцией VM: -Dspring.profiles.active=локальный

Затем у меня есть файл с именем application-local.yml

в производстве : -Dspring.profiles.active=prod будет использовать файл application-prod.yml

Вот что я нашел из Интернета также. Но в этом случае имя файла не похоже на «application-dev.yml». Это похоже на application.yml, который находится внутри папки dev/. В этом проблема.

Yathindra Kodithuwakku 11.03.2019 15:04

Есть ли причина, по которой вы не можете переименовать файлы?

Florian Nicolas 11.03.2019 15:04

Да. Также переименование не будет работать, если все эти файлы не будут помещены только в папку ресурсов. Не так ли?

Yathindra Kodithuwakku 11.03.2019 15:06

Ну, в моем проекте файлы application-*.yml лежат в resources/config, так что думаю должно работать. edit: nvm кажется, конфигурация - это особый случай

Florian Nicolas 11.03.2019 15:08

Я не понял. Можете ли вы объяснить, как вы получаете доступ к yml внутри папки конфигурации.

Yathindra Kodithuwakku 11.03.2019 15:56

В папке ресурсов

Сделайте файл application.yml, application-local.yml, application-dev.yml и т. д., что хотите

а потом в application.yml

 spring.profile.active = ${ENV}

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

В качестве альтернативы вы можете использовать -D spring.profile.active=dev

Я хочу сохранить эту структуру папок. Вместо того, чтобы помещать все файлы application.yml в каталог ресурсов.

Yathindra Kodithuwakku 11.03.2019 15:08

сначала из документация:

SpringApplication loads properties from application.properties files in the following locations and adds them to the Spring Environment:

  1. A /config subdirectory of the current directory
  2. The current directory
  3. A classpath /config package
  4. The classpath root

Итак, с переданной иерархией каталогов у вас будут проблемы.

во-вторых, для спецификации файла вы можете использовать Профили. Это работает следующим образом:

  • если не указаны профили - будет использоваться application.properties
  • для любого дополнительного профиля также будет использоваться профиль с именем application-<name>.properties

Таким образом, если вы укажете профили dev и cool, будут использоваться свойства application.properties, application-dev.properties, `application-cool.properties.

Обновлено:

Вы можете передать spring.config.location для указания пути к файлу свойств, но если вы хотите, чтобы иерархия каталогов была такой же, как у вас, вам нужны некоторые настройки с использованием context.initializers.classes и ApplicationContextInitializer.

Классическое решение — настроить один конфигурационный файл. (Я предпочитаю свойства, потому что я в здравом уме) и разрешить размещение файла переопределений на каждом установленном хосте.

Spring поддерживает это из коробки.

Вот пример:

public static void main(final String[] argumentArray)
{
  final StringApplicationBuilder springApplicationBuilder;

  springApplicationBuilder = new SpringApplicationBuilder(YourSpringBootApplication.class)

  springApplicationBuilder.properties(
    "spring.config.location=classpath:/yourConfig.properties,/some/path/to/overrides/directory/yourConfig.properties");

  springApplicationBuilder.build().run(argumentArray);
}

Другие вопросы по теме