gpt4 book ai didi

jsf - FacesContext#getViewRoot() 在设置 for first time 时返回 null

转载 作者:行者123 更新时间:2023-12-04 14:41:18 28 4
gpt4 key购买 nike

我正在尝试在一页中更改我的 JSF 应用程序区域设置,而这必须更改我的所有页面区域设置。我已经关注了这个链接,它运作良好Localization in JSF, how to remember selected locale per session instead of per request/view

如果我运行该应用程序,我可以更改我的 index.xhtml 中的区域设置,并且该区域设置是针对每个 session 设置的,所以如果那时我转到页面 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);
}

}

文件索引.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>

文件索引_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)

最佳答案

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

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

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

您找到的答案也已更改。

关于jsf - FacesContext#getViewRoot() 在设置 <f :view locale> for first time 时返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30653945/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com