Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Servlets 如何在web.xml中外部化上下文参数值_Servlets_Jakarta Ee_Web.xml_Open Liberty - Fatal编程技术网

Servlets 如何在web.xml中外部化上下文参数值

Servlets 如何在web.xml中外部化上下文参数值,servlets,jakarta-ee,web.xml,open-liberty,Servlets,Jakarta Ee,Web.xml,Open Liberty,我正在尝试将一些遗留的(基于struts2的)web应用程序从Jboss迁移到OpenLiberty server,我想知道是否有一种方法可以从web.xml外部化上下文参数(或过滤器init参数)的值,就像在server.xml中使用${}语法或使用eclipse文件的mpConfig特性一样。 在最初的项目中,param值在构建时使用占位符替换注入web.xml中,但根据12-factor 3rd建议,我更倾向于在软件外部,例如在环境变量中设置此值。 在我的特定情况下,我需要配置一个serv

我正在尝试将一些遗留的(基于struts2的)web应用程序从Jboss迁移到OpenLiberty server,我想知道是否有一种方法可以从web.xml外部化上下文参数(或过滤器init参数)的值,就像在server.xml中使用${}语法或使用eclipse文件的mpConfig特性一样。 在最初的项目中,param值在构建时使用占位符替换注入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
${remincl.resource.provider}
...
上下文参数的运行时值为:“${remincl.resource.provider}”,而不是存储在环境变量中的实际值


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

实现这一点的JavaEE标准方法是使用
javax.servlet.ServletContextListener

例如:

@WebListener
公共类MyServletContextListener实现ServletContextListener{
@凌驾
公共void contextInitialized(ServletContextEvent事件){
//从最方便的位置获取上下文值:
//System.getProperty()、System.getenv()、MP配置API等
字符串值=System.getProperty(“remincl.resource.provider”);
event.getServletContext().setInitParameter(“remincl.resource.provider”,value);
}
@凌驾
public void contextdestromed(ServletContextEvent事件){}
}

我尝试了您的解决方案:最初它似乎没有按预期工作(该值未被覆盖),但这是因为您无法覆盖上下文参数或筛选器初始化参数(如果未设置,则方法setInitParameter()返回false,因为此ServletContext已包含具有匹配名称的上下文初始化参数)在我的例子中,它已经在web.xml中定义了占位符值。因此,我简单地删除了web.xml中的声明,它就成功了。