我正在尝试使用spring外部化配置,但无法使其正常工作..
这是我到目前为止所做的:
为每个环境在war文件(src / test / resources /)中创建一个属性文件。 例如:nonprod-key.properties& prod-key.properties,内容如下:
key.name=NameOfPrivateKey.pfx
key.password=JustAPasswordForPrivateKey
然后在我的jboss-cxf.xml中,我想读取上面的值如下:
<import resource="#{systemProperties['environment']}-key.properties" />
<http:conduit name="*.http-conduit">
<http:tlsClientParameters
secureSocketProtocol="SSL">
<sec:keyManagers keyPassword="${key.password}">
<sec:keyStore type="PKCS12" password="${key.password}" resource="${key.name}" />
</sec:keyManagers>
... ... ...
</http:tlsClientParameters>
</http:conduit>
然后在eclipse中运行配置 - &gt;参数 - &gt; VM参数
-Denvironment=nonprod
不幸的是,上述方法无效。 :(
我收到此错误消息:
class path resource [#{systemProperties['environment']}-key.properties] cannot be opened because it does not exist
但似乎无法让它发挥作用。我究竟做错了什么? 有人可以举例说明如何做到最好。
谢谢。
-SGB
答案 0 :(得分:2)
我认为需要在Spring 3.1.x上使用配置文件。我们不是......但是。
无论如何,似乎对我们有用的最终解决方案是使用:
<context:property-placeholder location="classpath:${environment}-key.properties"/>
而不是
<import resource="#{systemProperties['environment']}-key.properties" />
其他所有内容与原始帖子(问题)中列出的相同。
希望有人觉得这很有用。
SGB
答案 1 :(得分:0)
您可以使用Property Place Holder。如果您想要灵活的配置,例如。存储在战争中的默认配置可以被外部配置覆盖,您可以直接使用PropertyPlaceholderConfigurer bean,如:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:ignoreResourceNotFound="true">
<property name="locations">
<array>
<bean class="org.springframework.core.io.ClassPathResource" c:path="${environment}-key.properties"/>
<bean class="org.springframework.core.io.FileSystemResource" c:path="relative/path"/>
</array>
</property>
</bean>
路径属性可以使用SPEL来引用属性或系统env变量。
查看此article和此how to read System environment variable in Spring applicationContext