4

状況

Spring ブート アプリケーションの太い .jar があります。application.propertiesファイルを使用して構成を外部化しました。このファイルは .jar と同じフォルダーにあり、同じフォルダー内のコマンド ラインから .jar を開始しています (コマンド「java -jar $jarFileName」を使用)。

次に、例外がスローされます。

nested exception is org.springframework.beans.TypeMismatchException: 
Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is 
java.lang.NumberFormatException: For input string: "${elasticsearch.port}"

ご覧のとおり、プロパティ ファイルから値を読み取る代わりに、次のように @Value アノテーションのテキストとして文字列を設定するだけです。

@Value("${elasticsearch.port}")
private int elkPort;

これが発生するクラスには、 の注釈が付けられてい@Componentます。Spring docs: externalized configurationによると、 Springapplication.propertiesは jar の外部のファイルを読み取る必要があります。

同じapplication.propertiesファイルを配置するsrc/main/resourcesと正常に動作するため、構成ファイルは正しいようです。

外部構成ファイルをロードしない理由はありますか?

EDIT 1--spring.config.location=file:application.propertiesまた、 and を使用して実行しようとしまし--spring.config.location=file:/full/path/to/application.propertiesたが、上記と同じ結果になりました。

編集 2: クラスパスの試行classpath代わりにfile、上記のコマンドと同じですが、fileに置き換えましたclasspath。最後にどちらも使わずに試したので、ただ--spring.config.location=/path/to/file; への相対パスとフルパスの両方を使用しapplication.propertiesます。すべての試行で同じ結果/例外が発生しました。

EDIT 3 私の注釈付きアプリケーション:

@SpringBootApplication
public class ApplicationName {

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

EDIT 4次のよう に a を追加しようとしましたPropertySourcesPlaceholderConfigurer:

@Configuration
public class PropertyConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

そして、それぞれ@Valueにデフォルト値を追加しました。値ではなくデフォルト値にのみ解決されapplication.propertiesます。

4

3 に答える 3