Ситуация
У меня есть толстый .jar загрузочного приложения Spring. Я внедрил свою конфигурацию в файл 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: экстернализация конфигурации, Spring должен прочитать файл application.properties
за пределами банки.
Когда тот же файл application.properties
помещается в src/main/resources
, он работает нормально, поэтому файл конфигурации кажется правильным.
Любые идеи, почему он не загружает внешний файл конфигурации?
РЕДАКТИРОВАТЬ 1 Я также пытался запустить его с --spring.config.location=file:application.properties
и --spring.config.location=file:/full/path/to/application.properties
, но с тем же результатом, что и выше.
EDIT 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 Попытался добавить PropertySourcesPlaceholderConfigurer
следующим образом:
@Configuration
public class PropertyConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
А затем для каждого @Value
я добавил значение по умолчанию; он по-прежнему разрешается только значениями по умолчанию, а не значениями application.properties
.
@SpringBootApplication
. Вы же не пытаетесь загрузить файл самостоятельно, используя@PropertySource
? - person M. Deinum   schedule 01.05.2018@SpringBootApplication
в основной пост. - person Oromë   schedule 01.05.2018PropertySourcesPlaceholderConfigurer
Spring Boot позаботится об этом. Если это не работает, что-то в вашем приложении отключает обычное поведение. - person M. Deinum   schedule 02.05.2018