如何外部化web.xml中的context-param值

时间:2019-05-10 14:06:11

标签: servlets java-ee web.xml open-liberty

我正在尝试将一些旧的(基于struts2的)Web应用程序从Jboss迁移到Open-Liberty服务器,我想知道是否有一种方法可以将context-params的值外部化(或过滤init-params) ),就像使用server.xml中的$ {}语法或使用eclipse microprofile的mpConfig功能一样。 在原始项目中,使用占位符替换在构建时将参数值注入到web.xml中,但是根据12因子第3条建议,我希望将此值设置在软件外部,例如在环境变量中。 在我的特定情况下,我需要配置一个Servlet过滤器和一个自定义标签库,并带有与环境相关的参数值。

我已经尝试在web.xml中使用$ {}语法,但是没有运气:

...
  <context-param>
    <param-name>remincl.resource.provider</param-name>
    <param-value>${remincl.resource.provider}</param-value>
  </context-param>
...

上下文参数的运行时值为:“ $ {remincl.resource.provider}”,而不是存储在环境变量中的实际值。

我认为JEE规范不允许这种行为,但是我想知道开放自由是否提供了一些额外的功能来解决此问题。否则,我必须在构建时继续注入值(或更改filter和taglib的配置策略)。

1 个答案:

答案 0 :(得分:1)

JavaEE标准的方法是使用javax.servlet.ServletContextListener

例如:

@WebListener
public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // Get the context value from wherever is most convenient:
        // System.getProperty(), System.getenv(), MP Config API, etc
        String value = System.getProperty("remincl.resource.provider");
        event.getServletContext().setInitParameter("remincl.resource.provider", value);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {}

}