我正在尝试将应用程序的配置文件与其战争分开。
我想将所有属性文件保存在磁盘上的目录中。然后,战争中所需的唯一属性将是配置目录的路径(假设它将位于名为config.properties
的文件中):
config.dir = /home/me/config
现在在spring配置中,我想加载这个文件(以便我知道其他文件的位置),然后是外部文件:
<bean id="propertySourcesPlaceholderConfigurer"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:META-INF/config.properties</value>
<value>${config.dir}/other.properties</value>
</list>
</property>
</bean>
但这不起作用,占位符未解决:
java.io.FileNotFoundException: class path resource [${config.dir}/config.properties] cannot be opened because it does not exist
我还尝试使用类型PropertySourcesPlaceholderConfigurer
的单独bean - 它没有多大帮助。
你知道我怎么能做到这一点吗?
答案 0 :(得分:3)
问题是configurer bean必须先完全构造才能解析上下文中其他bean定义中的占位符,因此不能在configurer的定义中使用占位符表达式来解决需要解决的问题由配置器本身。
您可以将配置目录的路径改为web.xml
作为context-param
<context-param>
<param-name>configDir</param-name>
<param-value>/home/me/config</param-value>
</context-param>
然后在Spring配置中将其作为#{contextParameters.configDir}
访问
<bean id="propertySourcesPlaceholderConfigurer"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations">
<list>
<value>#{contextParameters.configDir}/other.properties</value>
</list>
</property>
</bean>
或者您可以使用两个具有不同placeholderPrefix
值的独立配置器bean,一个加载config.properties
,然后填充另一个@{config.dir}
占位符,然后加载外部配置文件。
答案 1 :(得分:2)
可以通过为默认环境注册PropertySource来解决此问题。其中一种方法是使用Java配置:
@Configuration
@PropertySource("classpath:META-INF/config.properties")
public class MyConfig {
}
有了这个,占位符应该得到解决:
<bean id="propertySourcesPlaceholderConfigurer"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations">
<list>
<value>${config.dir}/other.properties</value>
</list>
</property>
</bean>