1

レガシーライブラリを使用するSpringブートアプリケーションを作成しました。このレガシーライブラリは、XMLでいくつかのSpring Beanを定義しています。コンストラクタの引数としてプロパティの値に取るのひとつ: Springブートコマンドラインプロパティがapplication.propertiesで定義されているオーバーライドプロパティではありません

my.url=http://localhost:8080 

が、私はMavenの春ブーツ使用:私の春のブートアプリで

<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> 

は、私は次のように、このプロパティを定義するapplication.propertiesを持っていますプラグインを使用してローカルで次のようにアプリケーションを実行します。

mvn spring-boot:run 

そして、プロパティ値が期待通りに注入されます。

私がしようとすると、このようなコマンドラインでmy.urlプロパティをオーバーライドする場合:

mvn spring-boot:run -Dmy.url=http://www.override.net 

オーバーライド値が使用されておらず、その代わり、application.properties内の値が使用されています。

Springブートのドキュメントによれば、コマンドラインからの値は、第一優先度として選択されるべきです:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html。これは、ここでは当てはまりません。application.propertiesからプロパティを削除すると、コマンドラインで渡された値が使用されるため、無視されるコマンドライン値ではないためです。 application.propertiesの値がコマンドラインの値を上書きしているようです。

何が起こっているかについてのアイデアはありますか?

+2

私は、-Dを使用するとjvm引数としてプロパティを渡し、春のブートプロパティではないと思います。 '--my.url = http:// www.override.net'を使って試してみましたか? –

+0

XML設定の完全版を投稿できますか? –

+0

@RahulSharma私は以下のアンディの提案に従って、それを試しましたが、違いはありませんでした。 – chrishern

答えて

0

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

1

使用-Dはシステムプロパティを設定します。 Spring Bootはシステムプロパティから設定を消費するので、一般的には動作します。しかし、spring-boot:runがシステムプロパティが間違ったJVM上に設定されるため、あなたのアプリケーション用に別のJVMをフォークしていると動作しません。それが機能していないので、私はそれが起こっていると思います。

-Drun.argumentsを使用すると、forkされたJVMで実行されているかどうかにかかわらず、実行中のアプリケーションに引数を渡すことができます。引数は接頭辞がそれぞれ--のコンマ区切りのリストでなければなりません。例えば、my.urlを設定します

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

この問題の他の原因は、あなたの主な方法は、それが作成されますSpringApplicationに受けることに引数を渡すされていないということです。また、あなたの主な方法は、このようになりますことを確認する必要があります:argsSpringApplication.runへの呼び出しに渡されていること

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

注意を。

+0

私は引数を渡す方法に変更を試みました(つまり、 Drun.arguments ...と違いはありません 主な方法は、既に作成されたアプリに引数を渡していました。 私はapplication.propertiesファイルにいくつかのプロパティがあり、正常にオーバーライドできました。それらはすべて-Dproperty.name = valueを使ってコマンドライン上にあります。この特定のプロパティは、私が依存しているライブラリで定義されているSpring Beanで使用されているという事実に似ています。 – chrishern

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

上記の行(context:property-placeholder)をbeans.xmlファイルから削除すると、この問題が解決されました。私はclasspath:application.propertiesがで正確ににロックしていると信じています(上書きを防ぐ)。

0

は、私の場合、私はこれが私の財産、プレースホルダに定義されていた:

local-override="true" 

は、だから私は、これを削除し、それが問題を解決しました。

関連する問題