场合
我有一个胖的.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
注释。
根据{{3}},spring应该读取jar之外的application.properties
文件。
当application.properties
中放置相同的src/main/resources
文件时,它可以正常工作,因此配置文件似乎是正确的。
为什么它不会加载外部配置文件的任何想法?
编辑1
我也尝试使用--spring.config.location=file:application.properties
和--spring.config.location=file:/full/path/to/application.properties
运行它,但结果与上面相同。
编辑2:类路径尝试
还尝试了classpath
而不是file
,与上面的命令相同,但file
替换为classpath
。
最后没试过,所以只是--spring.config.location=/path/to/file
;再次使用application.properties
的相对路径和完整路径。所有尝试都给出了相同的结果/异常。
编辑3 我的注释申请:
@SpringBootApplication
public class ApplicationName {
public static void main(String[] args) {
SpringApplication.run(ApplicationName.class, args);
}
}
编辑4
尝试添加PropertySourcesPlaceholderConfigurer
如下:
@Configuration
public class PropertyConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
然后对于每个@Value
我添加了一个默认值;它仍然只能解析为默认值而不是application.properties
值。
答案 0 :(得分:0)
如上所述,您应该指定外部配置位置
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
尝试不使用file关键字 --spring.config.location = /全/路径/ application.properties
答案 1 :(得分:0)
我刚从Eclipse Spring Boot项目中取出了我的application.properties,但它失败了。 然后我将文件放在项目根目录下的cfg文件夹中,并添加了程序参数:
--spring.config.location=cfg/application.properties
它再次起作用。 Mayby如果你尝试一个相对路径(没有前导/)到文件(没有"文件:")它将工作。
答案 2 :(得分:0)
在经过一番挣扎之后,我找到了解决办法。我和PropertySourcesPlaceholderConfigurer
很接近,但还没到那里;现在这是全班:
@Configuration
public class PropertyConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
final PropertySourcesPlaceholderConfigurer ppc = new PropertySourcesPlaceholderConfigurer();
ppc.setIgnoreResourceNotFound(true);
final List<Resource> resources = new ArrayList<>();
resources.add(new FileSystemResource("relative/path/to/application.properties"));
ppc.setLocations(resources.toArray(new Resource[]{}));
return ppc;
}
}
修改强>
为了演示此问题,我创建了一个存储库来显示问题,请参阅此处:https://github.com/Locitao/test-external-properties