JSF 2.0 - переключение локали с помощью h: commandLink - пакет сообщений не синхронизирован - PullRequest
3 голосов
/ 15 марта 2012

На моей странице xhtml у меня есть следующий тег:

<f:view locale="#{languageBean.locale}">
...
</f:view>

Я реализовал языковой компонент:

@ManagedBean(name = "languageBean")
@SessionScoped
public class LanguageBean implements Serializable {

  private static final long serialVersionUID = -4260383661321467037L;

  ...    

  private Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();

  public String switchToDE() {
    LOGGER.info("switching to german");
    Locale german = Locale.GERMAN;
    FacesContext.getCurrentInstance().getViewRoot().setLocale(german);
    this.locale = german;
    return null;
  }

  public String switchToEN() {
    LOGGER.info("switching to english");
    Locale english = Locale.ENGLISH;
    FacesContext.getCurrentInstance().getViewRoot().setLocale(english);
    this.locale = english;
    return null;
  }

  public Locale getLocale() {
    return locale;
  }

  public void setLocale(final Locale locale) {
    this.locale = locale;
  }

}

Затем я хочу отобразить commandLinks для переключения локали:

<ul>
  <li>
      <h:form>
          <h:commandLink class="" action="#{languageBean.switchToDE}">Deutsch</h:commandLink>
      </h:form>
  </li>
  <li>
      <h:form>
          <h:commandLink action="#{languageBean.switchToEN}">English</h:commandLink>
    </h:form>
  </li>
</ul>

В некоторых местах на моей странице есть несколько выходов, на которых я отрисовываю сообщения:

#{msg['message.key.1']

В моем файле face-config.xml я настроил:

<locale-config>
  <default-locale>de</default-locale>
  <supported-locale>de</supported-locale>
  <supported-locale>en</supported-locale>
</locale-config>

Теперь моя проблема: первый щелчок вызывает метод переключения языка, но пакеты сообщений не обновляются на странице.Если я нажимаю второй раз на том же языке, пакет сообщений обновляется.Поиск пакета сообщений всегда на один шаг позади переключения локали.Как я могу переключить локаль с тегом h: commandButton (мне нужна ссылка и руководство по стилю не разрешают использовать или), чтобы поиск пакета сообщений был синхронизирован?

Я использую GF 2.1 с Mojarra 2.0.9(JSF 2.0 на основе Servlet API 2.5).Любой совет приветствуется.

РЕДАКТИРОВАТЬ:

Хорошо, я узнал, что это была моя вина, потому что мы пробовали некоторые "особые" вещи; -)

Я пытаюсь объяснитьчто у нас есть и что мы пытаемся:

  • мы создаем наше программное обеспечение с помощью maven
  • мы разделили логически разные веб-приложения для разных бизнес-целей в репозитории SVN
  • во время сборки мы объединяем все веб-приложения в одно (наложение WAR)
  • , поэтому у нас есть для каждого бизнес-приложения веб-приложения.xml зарегистрирован
  • каждое веб-приложение имеет свой собственный пакет ресурсов, зарегистрированный с именем "msg "
  • у нас есть общее веб-приложение (фреймворк), которое отображает элементы навигации для всех зарегистрированных веб-приложений
  • каждый веб-сайт имеет возможность зарегистрировать nav-элементы.
  • фреймворктеперь пытается объединить все пакеты ресурсов в один большой пакет ресурсов во время фазы, на которой будут возвращены текущие элементы навигации.

Я обнаружил, что метод "getItems ()" в нашем компоненте навигации называетсядо запуска метода switchLocale и, следовательно, переключение языкового стандарта происходит слишком поздно.

Теперь я пытаюсь спросить, есть ли возможность переключить языковой стандарт с помощью h: commandLink или, возможно, с помощью ah: outputLink, чтобыпереключение локали происходит до того, как будет запущен метод вспомогательного компонента для getItems ()?

Я надеюсь, что я объяснил свой "вызов", чтобы он был понятен.

1 Ответ

2 голосов
/ 16 марта 2012

Я не уверен, как и почему эта проблема вызвана.Вы можете попробовать следующее, чтобы заставить JSF воссоздать представление.Вместо того, чтобы возвращать null в методах действия, возвращайте пустую строку или принудительно перенаправляйте в тот же самый вид.1010 * к конкретному вопросу, если ваша среда поддерживает EL 2.2, было бы больше DRY , если бы вы использовали для этого метод одиночного действия.Например,

public String switchLanguage(String language) {
    // ...
}

с

<h:commandLink action="#{languageBean.switchLanguage('EN')}">English</h:commandLink>
...