Свойство командной строки 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 переопределяет значение командной строки.



Есть ли у кого-нибудь идеи относительно того, что происходит?
589   4  

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.net
Другая возможная причина этой проблемы заключается в том, что ваш основной метод не передает Аргументы, которые он получает в SpringApplication, который он создает. Вы также должны проверить, что ваш основной метод выглядит примерно так:
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

    Ничего не найдено.