使用Spring启动时无法在@PropertySource中解析$ {...}

时间:2014-02-07 00:20:31

标签: spring spring-boot

我使用Spring的Java配置来配置我的应用程序。下面是注释的片段。部署到Tomcat容器的应用程序没有问题。 ${CONFIG_PATH}在系统/环境属性中定义CONFIG_PATH时正确解析。

@Configuration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = { Configuration.class }) })
@PropertySource(value = { "file:${CONFIG_PATH}/app.properties" })
@EnableAutoConfiguration
@EnableMongoRepositories
public class AppConfig { ... }

我最近开始使用Spring-Boot,这样我就可以构建一个嵌入了Tomcat的独立可执行jar。但是,现在@PropertySource(value = { "file:${CONFIG_PATH}/app.properties" })不起作用;它会导致以下错误。

Exception in thread "main" java.lang.IllegalStateException: Resource not found: file:${CONFIG_PATH}/app.properties

我的临时解决方案是对路径进行硬编码,如下所示。

//@PropertySource(value = { "file:${CONFIG_PATH}/app.properties" })
@PropertySource(value = { "file:/usr/local/etc/app.properties" })

我还是春营的新手。所以我确定我错过了一些东西。我非常感谢你对这个问题的任何帮助。

提前致谢。

更新1 : 我查看了默认的appplication.properties,发现了4个位置需要。出于干净部署的原因,属性文件不应位于类路径中。如果我们有多个应用程序部署,那么让属性文件相对于应用程序所在的位置会使管理配置变得更加困难。

1 个答案:

答案 0 :(得分:1)

从Spring Boot README

开始
  

如果您不喜欢application.properties作为配置文件名,可以通过指定spring.config.name环境属性切换到另一个。您还可以使用spring.config.location环境属性来引用显式位置。

我可能只是使用这个启动参数(在bootscript或其他东西中)来指定配置文件。

我猜更换不起作用的原因是由于弹簧靴的性质。应用程序上下文也用于引导/配置servlet容器,因此@PropertySource的常规规则可能不适用。你可以(或者应该)register an issue为此。