【问题标题】:how to externalize context-param values in web.xml如何在 web.xml 中外部化上下文参数值
【发布时间】:2019-05-10 14:06:11
【问题描述】:

我正在尝试将一些遗留(基于 struts2)的 Web 应用程序从 Jboss 迁移到 Open-Liberty 服务器,我想知道是否有办法将上下文参数的值外部化(或过滤 init-params ) 来自 web.xml,就像使用 server.xml 中的 ${} 语法或使用 eclipse microprofile 的 mpConfig 功能一样。 在原始项目中,参数值在构建时注入 web.xml,使用占位符替换,但根据 12-factor 3rd 建议,我更愿意在软件外部设置此值,例如在环境变量中。 在我的具体情况下,我需要配置一个 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 规范不允许这种行为,但我想知道 open-liberty 是否提供了一些额外的功能来解决这个问题。否则我必须在构建时继续注入值(或更改过滤器和标签库的配置策略)。

【问题讨论】:

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


    【解决方案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) {}
    
    }
    

    【讨论】:

    • 我尝试了您的解决方案:最初它似乎没有按预期工作(该值没有被覆盖)但这是因为您无法覆盖上下文参数或过滤器初始化参数(方法 setInitParameter() 如果未设置则返回 false,因为此 ServletContext 已包含具有匹配名称的上下文初始化参数),并且在我的情况下,它已在 web.xml 中使用占位符值定义。所以我只是删除了 web.xml 中的声明,它就起作用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2014-03-16
    相关资源
    最近更新 更多