Свойство командной строки Spring Boot не переопределяет свойство, определенное в приложении.свойства
Я создал приложение Spring Boot, которое использует устаревшую библиотеку. Эта устаревшая библиотека определяет ряд компонентов Spring в XML. Один из которых принимает значение свойства в качестве аргумента конструктора:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="myBean" class="com.em.MyBean">
<constructor-arg name="url" value="${my.url}"/>
</bean>
</beans>
В моем приложении Spring Boot у меня есть application.properties, который определяет это свойство следующим образом:
my.url=http://localhost:8080
Я использую Maven Spring Boot plugin для запуска моего приложения локально следующим образом:
mvn spring-boot:run
И значение свойства вводится в боб, как и ожидалось.
Если я попытаюсь и переопределите свойство my.url в командной строке следующим образом:
mvn spring-boot:run -Dmy.url=http://www.override.net
Переопределенное значение не используется, а вместо него используется значение внутри application.properties.
Согласно документам Spring Boot, значения из командной строки должны быть выбраны в качестве первого приоритета: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html. похоже, что здесь это не так, потому что если я удаляю свойство из application.properties , то значение передается дальше используется командная строка, поэтому значение командной строки не игнорируется полностью. Похоже, что значение application.properties переопределяет значение командной строки.
Есть ли у кого-нибудь идеи относительно того, что происходит?
4 ответов:
С помощью
-Dзадает системное свойство. Spring Boot может потреблять конфигурацию из системных свойств, так что, вообще говоря, это будет работать. Однако это не будет работать, еслиspring-boot:runразветвляет отдельный JVM для вашего приложения, поскольку системное свойство будет установлено на неправильном JVM. Поскольку это не работает, я бы предположил, что это то, что происходит.Вы можете использовать
-Drun.argumentsдля передачи аргументов запускаемому приложению, независимо от того, выполняется ли оно в раздвоенной JVM. Аргументы должны быть а список через запятую с префиксом--. Например, чтобы задатьmy.url:Другая возможная причина этой проблемы заключается в том, что ваш основной метод не передает Аргументы, которые он получает вmvn spring-boot:run -Drun.arguments=--my.url=http://www.override.netSpringApplication, который он создает. Вы также должны проверить, что ваш основной метод выглядит примерно так:Обратите внимание, чтоpublic static void main(String[] args) throws Exception { SpringApplication.run(YourApplication.class, args); }argsпередается в вызовSpringApplication.run.
<context:property-placeholder location="classpath:application.properties"/>Удаление строки выше (контекст: свойство-заполнитель) из моих бобов.xml-файл решил эту проблему. Я верю в путь к классу: приложение.свойства фиксируют в точно , где искать (предотвращая переопределения).
В конце концов я решил эту проблему, изменив способ определения компонентов из устаревшей библиотеки для приложения Spring Boot. Вместо того, чтобы использовать applicationContext.xml устаревшего приложения, где были определены бобы, я добавил их в качестве
@Beans в моем классе конфигурации. Это решило проблему.
В моем случае это было определено в моем свойстве-заполнителе:
local-override="true"Поэтому я удалил это, и это решило проблемы.
Comments