如何用Tomcat覆盖spring属性param?

时间:2015-05-19 09:15:35

标签: java spring spring-mvc tomcat

我在Spring应用程序中定义了属性。

@Configuration
public class WebappConfiguration {

    @Value("${ext.storage.path}")
    private String extDirectoryPath;

    public String getExtDirectoryPath() {
        return extDirectoryPath;
    }
}

ext.storage.path属性的默认值在application.properties文件中定义。

application.properties

ext.storage.path=/home/user/ext/

当我使用VM选项WAR-Dext.storage.path=/var/webapp-data/部署到tomcat时,会成功加载此值。但是我希望从每个环境的上下文文件中更加智能地加载属性值。

因此,我将WAR部署到Tomcat的ROOT,WAR文件的名称为ROOT.war,并将其展开到ROOT目录。我在路径context上创建了{CATALINA_BASE}/Catalina/localhost/ROOT.xml文件,其中包含以下内容。

的ROOT.xml

<Context 
        docBase="/opt/webapp-tomcat/webapps/ROOT.war"
        path=""
        reloadable="true">

        <Parameter name="ext.storage.path" value="file:/var/webapp-data/" override="true"/>

</Context>

不幸的是,param没有按照方式加载,它的默认值来自application.properties

修改 经过一些调查后,我将Parameter放入Tomcat的主context.xml文件中,并重写了该值。

<Parameter name="ext.storage.path" value="file:/var/webapp-data/" override="true"/> 

1 个答案:

答案 0 :(得分:1)

我所知道的最好的技术是将特定于环境的东西放入Tomcat的conf / context.xml文件中。

  <Environment name="myApp/extStoragePath" type="java.lang.String" value="/var/data/myapp"/>

这定义了一个JNDI变量,您可以在代码中使用以下内容查找:

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
String extStoragePath = (String) envCtx.lookup("myApp/extStoragePath");

您还可以使用此技术加载复杂对象,如数据库数据源等。它具有巨大的优势:

  • 配置是个人的环境,而不是应用程序
  • 您不需要使用Tomcat启动脚本
  • 相同的二进制文件将在DEV,UAT和PROD中运行而无需修改。这大大简化了构建过程。

另外,Spring提供了一个org.springframework.jndi.JndiObjectFactoryBean,它可以从你的spring配置文件中访问JNDI。