Изменение языка приложения вносит изменения для всех пользователей (Vaadin) - PullRequest
2 голосов
/ 26 января 2012

В моем приложении я настраивал локаль, когда пользователь входит в систему, чтобы локализовать компоненты.Недавно я давал демонстрацию и заметил, что язык переключается с английского на голландский без видимой причины.Оказалось, что к демонстрационному серверу (расположенному на немецком сервере) одновременно обращался другой человек, который установил его на голландский и влиял на мою английскую демоверсию и наоборот.

Я попробовал на своем компьютере разные браузеры, используя нормальный режим Chrome и режимы инкогнито и т. Д. Для имитации различных сеансов, и проблема присутствует.Любые идеи о том, как справиться / исправить это?Я думал, что Vaadin уже обрабатывал пользовательские сессии самостоятельно, но кажется, что переменные приложения являются общими?

Вот что я делаю в своем приложении, чтобы изменить локаль:

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

Затем xerbпакет ресурсов используется для интернационализации пользовательского интерфейса.Я пытался не делать супер-вызов, но результат тот же, как если бы xerb изменялся различными сеансами и передавался между ними.

Есть идеи?

Тот же вопрос на форуме Ваадина: 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 ]

2 голосов
/ 01 февраля 2012

Попробуйте применить шаблон ThreadLocal для доступа к экземпляру Application из других элементов управления в приложении.Таким образом, это становится более явным, когда вы пытаетесь получить некоторую информацию о сеансе.Это также довольно широко распространено в приложениях Vaadin, поэтому код может быть более читабельным.

Косвенная передача ссылки на поля вашего Application, делая его внешним классом для анонимных слушателей, может привести к трудностям в обнаружении ошибокпотому что может быть трудно определить точный момент создания элементов управления и то, на что на ResourceBundle ссылались в тот самый момент.

2 голосов
/ 27 января 2012

Vaadin обрабатывает пользовательские сессии и хранит переменные отдельно, так что это не нормальное поведение.Поле 'xerb' должно быть как-то разделено между пользователями.Вот только несколько причин, о которых я могу думать прямо сейчас:

  1. xerb - это статическое поле
  2. ResourceBundle, на которое указывает xerb, является тем же(статический) один
  3. Фактический экземпляр Application распределяется между пользователями

Вы уже сказали, что # 1 не является причиной.Возможно, это №2, но я не знаю, возможно ли это.# 3 было бы возможно, если у вас есть собственный ApplicationServlet, содержащий ошибку, которая заставляет его возвращать один и тот же экземпляр Application для всех пользователей.Или, может быть, есть какой-то механизм впрыска, который вводит одну и ту же вещь во все приложения?

Без дополнительной информации невозможно узнать, что происходит на самом деле.

HTH

...