Переопределить свойство с помощью моего разработчика профиля в Spring Boot 2.4

#java #spring #spring-boot

#java #весна #spring-boot

Вопрос:

Я попытался проверить свойство

 kafka.servers=s101lbakafpep1:9092,s102lbakafpep2:9092,s101lbakafpep3:9092
 

определено в моем файле src /main /resources /config /application-kafka.properties

с этим значением

 kafka.servers=localhost:9092
 

определено в моем файле src / main / resources / application-dev.properties

Я перепробовал все возможные комбинации, читая документ spring boot, изменяющий в моем application.properties порядок

 spring.profiles.active=config,health,planete,dgfip,mapping,kafka,dev
spring.profiles.active=dev,config,health,planete,dgfip,mapping,kafka
 

используя spring.config.use-legacy-processing для true или false или .include, всегда выигрывает конфигурация kafka

Это не работает, так как я изменил версию spring boot на 2.4

Комментарии:

1. Где определено свойство активного профиля? Как вы запускаете свое приложение?

2. Извините, только что увидел ответ на мой первый вопрос. Вы пробовали активировать один профиль или активировать профили с помощью аргумента командной строки?

3. @burm87 я запускаю свое приложение с помощью intellij, я попытался добавить профиль разработчика с помощью метода setAdditionalProfiles, если бы у меня был только профиль разработчика, все в порядке

4. Можете ли вы увидеть строку журнала активного профиля в журналах? Вы уверены, что все имена верны? На самом деле, я только что заметил, что ваш файл kafka и ваш файл -dev находятся в двух разных папках, вы пробовали поместить их в одну и ту же?

5. да, я вижу имена профилей в файле журнала, и я также попытался поместить их в ту же папку…

Ответ №1:

Спасибо за очень полезный совет @gviczai, решил мою проблему с загрузкой и переопределением конфигураций из файлов YAML. Я полностью пропустил следующее предложение в документации, из-за которого мои модульные тесты завершились неудачей, поскольку значения не были переопределены, как это было в случае с Spring Boot 2.3.

Импорт можно рассматривать как дополнительные документы, вставленные чуть ниже документа, который их объявляет. Они следуют тому же порядку сверху вниз, что и обычные файлы с несколькими документами: импорт будет импортирован только один раз, независимо от того, сколько раз он объявлен.

Поэтому, если вы хотите переопределить импортированные значения, после импорта необходимо запустить новый документ (— в yaml, #— в свойствах).

 # imported-config.yaml
my-key: my-value
 
 # application.yaml
spring:
    config:
        import:
            - classpath:imported-config.yaml

# before starting a new document the value can not be modified, it would still be "my-value"
my-key: here-overriding-does-not-work
---
# after the start of the new document the value can be modified
my-key: my-overridden-value
 

Ответ №2:

В Spring Boot 2.4 обработка файлов конфигурации полностью переосмыслена и переписана. Короче говоря: забудьте устаревшие документы, зависящие от профиля. Отныне вам нужно использовать только один большой файл application.properties, но его можно разделить на различные разделы, активируемые профилем. Затем эти разделы могут поступать из других файлов или даже документов по URL-адресам — см. cloud-config .

И главное правило таково: определения НИЖЕ всегда перезаписывают определения ВЫШЕ. Поэтому будьте осторожны с порядком следования разделов (таким образом, профилей) друг за другом! 😉

Вы можете разделить разделы с помощью «#—«, и вы можете определить, какой профиль активирует раздел, указав «spring.config.activate.on-profile=<your_profile>»

Итак, в вашем случае ваш application.properties должен выглядеть следующим образом:

 my.property=anything
...
server.name=myserver
#in your 'default' section, you can activate any profile, so it will be active by default
spring.profiles.active=kafka
#---
spring.config.activate.on-profile=kafka
spring.config.import=application-kafka.properties
#---
spring.config.activate.on-profile=dev
spring.config.import=application-dev.properties
#---
spring.config.activate.on-profile=cloud
spring.config.import=optional:configserver:http://my.config.server:8080/cloud-config
 

Конечно, вы можете использовать файл yaml, если хотите. В этом случае разделителем документов является стандартный «—«.

Подробнее об этой новой парадигме обработки конфигурационных файлов читайте здесь: https://spring.io/blog/2020/08/14/config-file-processing-in-spring-boot-2-4

(И я думаю, что профиль «кафки» выигрывает у «разработчика», потому что «k» стоит ПОСЛЕ «d» в abc… Кстати, я думаю, что лучше не называть импортированные документы в соответствии с устаревшим соглашением об именовании, зависящим от профиля «application-<profile>.properties», поскольку это может повлиять на код обработки профиля. Лучше быть в безопасности, чем потом сожалеть.)

Совет: Обратите внимание, что в том же «документе» (разделе в том же файле, который считается документом) даже spring.config.import может перезаписывать предыдущие значения. Поэтому, если вам нужно импортировать несколько источников в один раздел, используйте список, разделенный запятыми:

 spring.config.import=classpath:config/kafka.properties,classpath:db/postgres.properties
 

Комментарии:

1. Это неверно, свойства, зависящие от профиля, автоматически импортируются из соответствующих профилей: ` spring.config.activate.on-profile=dev spring.config.import=application-dev.properties « является избыточным. Вы просто не можете добавлять активные профили из файла, специфичного для профиля.

Ответ №3:

они не находятся в одной папке, и конфигурация запуска, вероятно, указывает /config для сканирования.

Ответ №4:

Он снова работает с spring-boot 2.5.6, поэтому он был исправлен в 2.5.x