5

我创建了一个使用旧库的 Spring Boot 应用程序。这个遗留库在 XML 中定义了许多 Spring Bean。其中一个将属性值作为构造函数参数:

<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 插件在本地运行我的应用程序,如下所示:

mvn spring-boot:run

并且属性值按预期注入到 bean 中。

如果我尝试像这样覆盖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

5 回答 5

6

使用-D设置系统属性。Spring Boot 可以使用系统属性中的配置,所以一般来说,它会起作用。但是,如果为您的应用程序分叉一个单独的 JVM,它将不起作用,spring-boot:run因为系统属性将设置在错误的 JVM 上。由于它不起作用,我猜这就是正在发生的事情。

您可以使用-Drun.arguments将参数传递给正在运行的应用程序,无论它是否在分叉的 JVM 中运行。参数应该是一个逗号分隔的列表,每个列表都以--. 例如,要设置my.url

mvn spring-boot:run -Drun.arguments=--my.url=http://www.override.net

此问题的另一个可能原因是您的 main 方法没有将它接收的参数传递给SpringApplication它创建的参数。您还应该检查您的 main 方法是否类似于以下内容:

public static void main(String[] args) throws Exception {
    SpringApplication.run(YourApplication.class, args);
}

请注意,args它被传递到对SpringApplication.run.

于 2016-05-12T16:42:25.507 回答
1
<context:property-placeholder location="classpath:application.properties"/>

从我的 beans.xml 文件中删除上面的行 (context:property-placeholder) 解决了这个问题。我相信 classpath:application.properties 正在锁定确切的位置(防止覆盖)。

于 2017-03-24T23:53:00.277 回答
0

就我而言,我在我的属性占位符上定义了这个:

local-override="true"

所以我删除了它,它解决了问题。

于 2017-07-14T14:41:46.257 回答
0

只是添加一个典型的错误:SpringApplication.run应用程序主类中使用的方法接受一个可变长度的参数,如果不提供任何参数,则不会引发编译时警告:

public static void main( String[] args )
{
    SpringApplication.run( MyApplication.class, args );
}

args参数从 main 方法传递到SpringApplication.run. 如果您不这样做,则不会拾取或生效任何命令行参数。

于 2020-02-18T12:56:54.303 回答
-1

我最终通过更改为 Spring Boot 应用程序定义遗留库中的 bean 的方式解决了这个问题。我没有使用定义 bean 的遗留应用程序的 applicationContext.xml,而是将它们添加到@Bean我的配置类中的 s 中。这解决了这个问题。

于 2016-10-26T13:35:06.013 回答