【问题标题】:Struts 2 override resource messages keysStruts 2 覆盖资源消息键
【发布时间】:2015-01-25 14:39:19
【问题描述】:

考虑一下

<constant name="struts.custom.i18n.resources"
        value="messages/default,messages/customize" />

default.properties的内容是

label.sample = Default Sample

而customize.properties的内容是

//Duplicate key
label.sample = Customize Sample

调用&lt;s:text name="label.sample"&gt; 将导致Customize Sample 如果我们查看上面的strust i18n,这似乎是正确的行为,因为我们首先定义了默认值,然后是自定义,因此自定义属性中的键将覆盖默认键。

现在我们尝试动态覆盖自定义消息。所以

   <!--The customize is removed -->
    <constant name="struts.custom.i18n.resources"
            value="messages/default" />

在某些地方,例如启动 servlet,我们将自定义消息添加为:

LocalizedTextUtil.clearDefaultResourceBundles();
LocalizedTextUtil.addDefaultResourceBundle("messages/customize");

这行不通!作为替代方案,如果我们从 i18n 属性中删除默认值并按照以下方式进行操作,我们将获得自定义值

LocalizedTextUtil.clearDefaultResourceBundles();
LocalizedTextUtil.addDefaultResourceBundle("messages/default");
LocalizedTextUtil.addDefaultResourceBundle("messages/customize");

是否可以在 xml 中保留默认属性列表,只在运行时添加自定义属性


这就是我们需要它的原因 我们正在开发和托管一个销售给许多客户的网络应用程序。应用程序有一条默认消息。有可能我们的一位客户想要更改某些应用程序默认消息,而其他客户则不想。所以我们有一个自定义消息文件夹,让每个银行覆盖自己的消息。

我们为客户提供以下文件夹结构:

+messages
  -resources_fa_IR.properties
  -resources_en_US.properties 
+customer1
   -customize_fa_IR.properties
   -customize_en_US.properties
+customer2
   -customize_fa_IR.properties
   -customize_en_US.properties

在 StartUpSerlvet 中

//Set customer customize messages
LocalizedTextUtil.addDefaultResourceBundle("messages/" + activeCustomer+"/customize"); 

【问题讨论】:

  • 为什么需要这个?你真正想做什么?
  • 亲爱的@AleksandrM 请看我的更新
  • 首先,如果你想添加资源,你不应该调用clearDefaultResourceBundles。您的StartUpSerlvet 到底是什么以及它是如何配置的?
  • clearDefaultResourceBundles 你是对的。 StartUpSevlet 非常简单,ServletContextListener 从一些属性文件中获取活跃客户并调用LocalizedTextUtil。如果你觉得有帮助,我可以把代码放在这里!
  • 如果你在postInit方法中这样做对你有用吗?

标签: struts2 resourcebundle


【解决方案1】:

它不起作用,因为您的自定义 ServletContextListener 在 S2 添加来自 struts.custom.i18n.resources 的默认资源包之前运行。

解决方案是从某处执行 LocalizedTextUtil.addDefaultResourceBundle 在 S2 添加所有默认资源包之后执行的操作。 例如,您可以扩展 StrutsPrepareAndExecuteFilter 并在 postInit 方法中进行。

【讨论】:

  • 您的订单是正确的,使用postInit 解决了它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
相关资源
最近更新 更多