更改应用程序区域设置会对所有用户进行更改(Vaadin)

时间:2012-01-26 18:39:24

标签: localization locale vaadin

在我的应用程序中,当用户进入系统以本地化组件时,我设置了语言环境。最近我给了一个演示,注意到语言没有明显的原因从英语切换到荷兰语。事实证明,演示服务器(托管在德国服务器中)是由另一个人设置为荷兰语同时访问的,并影响了我的英语演示,反之亦然。

我在不同浏览器的机器上试了一下,使用Chrome普通模式和隐身模式等模拟不同的会话,问题就出现了。有关如何处理/修复此问题的任何想法?我认为Vaadin已经自己处理了用户会话,但似乎应用程序的变量是共享的?

以下是我在应用程序中更改语言环境所做的事情:

@Override
    public void setLocale(Locale locale) {
        super.setLocale(locale);
        xerb = ResourceBundle.getBundle("com.bluecubs.xinco.messages.XincoMessages", getLocale());
}

然后xerb资源包用于国际化UI。我尝试不进行超级调用,但结果是一样的,就像xerb被各种会话修改并在它们之间共享一样。

有什么想法吗?

Vaadin论坛上的同样问题:https://vaadin.com/forum/-/message_boards/view_message/1091312

修改

使用ThreadLocal模式我在每个实例获得时添加了输出,我看到每个浏览器的不同实例。 (即com.bluecubs.xinco.core.server.vaadin.Xinco@2114ed为第一个,com.bluecubs.xinco.core.server.vaadin.Xinco @ fd68fe为第二个浏览器)所以我相信模型使用正确。可悲的是,我仍然看到同样的问题。

2 个答案:

答案 0 :(得分:2)

Vaadin会处理用户会话并将变量分开,因此这不是正常行为。必须以某种方式在用户之间共享'xerb'字段。我现在能想到的唯一原因是

  1. xerb是一个静态字段
  2. ResourceBundle指向的xerb是相同的(静态的)
  3. 实际的Application实例在用户之间共享
  4. 你已经说过#1不是原因。 #2可能是它,但我不知道这是否可能。如果您的自定义ApplicationServlet包含导致它为所有用户返回相同的Application实例的错误,则可能会出现#3。或者也许有一些注入机制在所有应用程序中注入相同的东西?

    如果没有更多信息,就无法知道实际发生了什么。

    HTH

答案 1 :(得分:2)

尝试应用ThreadLocal pattern从应用中的其他控件访问Application实例。这样,只要您尝试获取某些特定于会话的信息,它就会更加明确。它在Vaadin应用程序中也非常普遍,因此代码可能更具可读性。

通过使其成为匿名侦听器的外部类来间接传递对Application字段的引用可能导致难以检测到错误,因为很难确定创建控件的确切时刻和在那一点上引用了ResourceBundle