5

レガシー ライブラリを使用する Spring Boot アプリを作成しました。このレガシー ライブラリは、XML で多数の Spring Bean を定義します。そのうちの 1 つは、コンストラクターの引数としてプロパティ値を受け取ります。

<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

1
<context:property-placeholder location="classpath:application.properties"/>

上記の行 (context:property-placeholder) を beans.xml ファイルから削除すると、この問題は解決しました。私は classpath:application.properties が正確にどこを見るべきかをロックしていると信じています(オーバーライドを防ぎます)。

于 2017-03-24T23:53:00.277 に答える
-1

最終的に、Spring Boot アプリケーション用にレガシー ライブラリの Bean を定義する方法を変更することで、これを解決しました。Bean が定義されたレガシー アプリケーションの applicationContext.xml を使用するのではなく@Bean、構成クラスに s として追加しました。これで問題は解決しました。

于 2016-10-26T13:35:06.013 に答える