在我的应用程序中,当用户进入系统以本地化组件时,我设置了语言环境。最近我给了一个演示,注意到语言没有明显的原因从英语切换到荷兰语。事实证明,演示服务器(托管在德国服务器中)是由另一个人设置为荷兰语同时访问的,并影响了我的英语演示,反之亦然。
我在不同浏览器的机器上试了一下,使用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为第二个浏览器)所以我相信模型使用正确。可悲的是,我仍然看到同样的问题。
答案 0 :(得分:2)
Vaadin会处理用户会话并将变量分开,因此这不是正常行为。必须以某种方式在用户之间共享'xerb'字段。我现在能想到的唯一原因是
xerb
是一个静态字段ResourceBundle
指向的xerb
是相同的(静态的)Application
实例在用户之间共享你已经说过#1不是原因。 #2可能是它,但我不知道这是否可能。如果您的自定义ApplicationServlet包含导致它为所有用户返回相同的Application实例的错误,则可能会出现#3。或者也许有一些注入机制在所有应用程序中注入相同的东西?
如果没有更多信息,就无法知道实际发生了什么。
HTH
答案 1 :(得分:2)
尝试应用ThreadLocal pattern从应用中的其他控件访问Application
实例。这样,只要您尝试获取某些特定于会话的信息,它就会更加明确。它在Vaadin应用程序中也非常普遍,因此代码可能更具可读性。
通过使其成为匿名侦听器的外部类来间接传递对Application
字段的引用可能导致难以检测到错误,因为很难确定创建控件的确切时刻和在那一点上引用了ResourceBundle
。