Struts 2覆盖资源消息密钥

时间:2015-01-25 14:39:20

标签: struts2 resourcebundle

考虑一下

<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

调用<s:text name="label.sample">将导致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中保留默认属性列表,并且只在运行时添加自定义属性


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

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

+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"); 

1 个答案:

答案 0 :(得分:1)

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

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