1

ユーザープロファイル設定のフォームがあります。これらの設定の 1 つは、サイトの既定の言語です。ユーザーがデフォルトの言語設定を変更すると、現在のセッションのロケールを変更したいと考えています。フォームの処理方法:

@ManagedBean(name="userEditBean")
@RequestScoped
public class UserEditBean {


    @ManagedProperty(value = LanguageBean.INJECTION_NAME)
    private LanguageBean languageMB;

    private AdminUsersEditForm editForm = new AdminUsersEditForm();


    public String changeDefaultLanguage() {
        editForm.getUser().setDefaultLanguage(editForm.getLocaleCode());
        adminUserEditService.update(editForm.getUser());
        languageMB.changeLocale(editForm.getLocaleCode());
        FacesContext context = FacesContext.getCurrentInstance();  
        context.addMessage(null, new FacesMessage(languageMB.translate("user.edit.languageChanged")));
        return "/pages/protected/user/edit.xhtml?faces-redirect=true";
    }

そして、changeLocale:

@ManagedBean(name="languageMB")
@SessionScoped
public class LanguageBean implements Serializable {
    public void changeLocale(String newLocaleValue) {
            //loop country map to compare the locale code
            for (Map.Entry<String, Object> entry : countries.entrySet()) {
                if(entry.getValue().toString().equals(newLocaleValue)){
                    FacesContext.getCurrentInstance()
                            .getViewRoot().setLocale((Locale)entry.getValue());
                }
            }
        }

DB の言語は変更されていますが、サイトは古いロケールのままです。サイトの言語を変更するために eventListener から changeLocale を呼び出すと機能するので、どこに問題がありますか。ありがとうございました。

更新: 私はいくつかのデバッグを行いましたが、問題は次の行の ViewHandlingStrategy#createView() にあります:

if (ctx.getViewRoot() != null) {
    locale = ctx.getViewRoot().getLocale();

ctx.getViewRoot() は明らかに null を返し、ロケールは getViewRoot() から設定されていません。しかし、viewRootがどこで「失われた」のかわかりません

4

1 に答える 1