FacesContext#getViewRoot() 首次设置 <f:view locale>时返回 null



我试图在一个页面中更改JSF应用程序的区域设置,这必须更改所有页面的区域设置。我遵循了这个链接,它工作得很好JSF中的本地化,如何记住每个会话而不是每个请求/视图所选择的地区

如果我运行应用程序,我可以更改index.xhtml中的区域设置,并且该区域设置是每次会话设置的,因此如果我转到页index_1.xhtml,我将看到区域设置更改。

我的问题是,当我运行应用程序,我写URL: http://localhost:8080/Myapp-war/faces/index_.xhtml转到index_1.xhtml页面,我改变区域设置,区域设置没有改变index.xhtml.

这是我的代码:

托管Bean

package controllers;
import java.io.Serializable;
import java.util.Locale;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
    @ManagedBean
    @SessionScoped
    public class LanguageSwitcher implements Serializable{
        private Locale locale; 

        @PostConstruct
        public void init() 
        {
            locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
        }

       public Locale getLocale() {
            return locale;
        }
        public String getLanguage() {
            return locale.getLanguage();
        }
        //Change locale
        public void changeLanguage(String language) {
            locale = new Locale(language);
            FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
        }   
    }

文件index.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html   lang="#{languageSwitcher.language}"
        xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

    <h:head>
    </h:head>
    <h:body>     
        <h3>Language switcher:</h3>
        <h:form id="language_form">
            <h:commandLink action="#{languageSwitcher.changeLanguage('es')}" value="Español" rendered="#{languageSwitcher.language != 'es'}"/> |
            <h:commandLink action="#{languageSwitcher.changeLanguage('en')}" value="English" rendered="#{languageSwitcher.language != 'en'}"/>
        </h:form>
       <h:outputText value="#{msg['greeting']}" />
    </h:body>
</html>

文件index_1.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html   lang="#{languageSwitcher.language}"
        xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
    <f:view locale="#{languageSwitcher.locale}">
    <h:head>
    </h:head>
    <h:body>     
        <h3>Language switcher:</h3>
        <h:form id="language_form">
            <h:commandLink action="#{languageSwitcher.changeLanguage('es')}" value="Español" rendered="#{languageSwitcher.language != 'es'}"/> |
            <h:commandLink action="#{languageSwitcher.changeLanguage('en')}" value="English" rendered="#{languageSwitcher.language != 'en'}"/>
        </h:form>
       <h:outputText value="#{msg['greeting']}" />
    </h:body>
  </f:view>
</html>

如果我写<f:view locale="#{languageSwitcher.locale}">在我的index.xhtml,当我运行应用程序,我得到一个错误。

我怎么解决它?

更新:

当运行应用程序时,我得到的错误是:

java.lang.NullPointerException在controllers.LanguageSwitcher.init (LanguageSwitcher.java: 56)

我重现了你的问题。这是自Mojarra 2.2.5以来应用的3021问题的结果。区域设置现在是在视图构建时确定的。以前,在编写您找到的答案时,区域设置是在视图呈现时确定的,这允许代码以这种方式找到视图的默认区域设置。但是,在视图构建期间,这是不可能的,因为视图还不存在。你看,getViewRoot()返回null

您需要从外部上下文中获取请求的区域设置。

@PostConstruct
public void init() {
    locale = FacesContext.getCurrentInstance().getExternalContext().getRequestLocale();
}

你找到的答案也被修改了

相关内容

  • 没有找到相关文章

最新更新