1. ホーム
  2. java

[解決済み] Spring boot が文字列のプレースホルダーを解決できない

2022-01-30 16:13:58

質問

組み込みのtomcatサーバーでspring-bootをmavenで実行しています。 mvn clean install spring-boot:run . しかし、実行するたびにこのエラーが発生します。

 Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'language' in string value "${language}"
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174) ~[spring-core-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:236) ~[spring-core-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) ~[spring-core-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172) ~[spring-context-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:831) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1086) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    ... 35 common frames omitted

そのエラーは、この2行のコードに関するものです。

@Value("${language}")
private String language;

その言語フラグは、私のapplication.propertiesでこのように指定されています。

application.properties

language=java
logging.level.org.springframework=TRACE

ここがわかりにくいところです。 を付けずにビルドを実行すると spring-boot:run コマンドを使用すると、正しくビルドされ、ビルドされたjarを全く問題なく実行できます。tomcatサーバーに組み込んで実行した場合のみ、この問題が発生します。

私のコードでこれを行うことで、これを回避することができます。

@Value("${language:java}")
private String language;

しかし、これでは意味がありません。というのも、spring はデフォルト値を application.properties ファイルを自動的に作成します。

EDIT : ご指摘の通り、読めません。 application.properties は、組み込みのtomcatサーバーで実行した場合、全く効果がありません。強制的に読み込ませる方法、または読み込まない理由があれば教えてください。埋め込み型ではなく、外部のアプリサーバーにデプロイした場合は問題なく動作します。

よろしくお願いします。

解決方法は?

以下の行をpomの <resources> セクション

<resource>
     <directory>src/main/resources</directory>
     <filtering>true</filtering>
     <includes>
          <include>**/*.properties</include>
     </includes>
</resource>

よくわからないのは、これをやる必要性です。

a) この行を追加しなくても、外部のアプリサーバーで実行でき、アプリが読み取るのは application.properties ということです。

b) eclipse でスタンドアロンの java アプリケーションとしてアプリを実行すると (つまり、maven を通してアプリをビルドすることなく)、次のように読み込まれます。 application.properties ちょうどいい

c) Spring-bootはデフォルトで関係なく読むことになっているのでは?(上の2つのケースで示されるように?)

皆さん、ありがとうございました。