JSF从selectMenu更改语言不会调用PostConstruct

时间:2014-12-29 19:59:46

标签: jsf

我在header.xhtml中更改了语言selectOneMenu。通过选择更改任何xhtml文件的语言。但是很少有页面在Java类本身中设置语言字符串,后者由Post-Construct调用。

Header.xhtml

<h:selectOneMenu value="#{client.language}" onchange="submit()" >
<f:selectItems value="#{client.languages()}" />
</h:selectOneMenu>

managed bean中,我有ViewScoped,然后是PostConstruct。我的问题是 - 从菜单中更改语言后,Java没有翻译某些字符串。那是因为PostConstruct调用了它,当语言改变时不会调用它。但是当我通过单击链接转到该页面时,字符串将被翻译。只是一旦我改变语言,字符串就不会被翻译。

我认为这里的问题是因为语言改变时不会调用PostConstruct。我该如何调用它?

2 个答案:

答案 0 :(得分:3)

您的问题基本上是关于@PostConstruct的行为。在创建bean之后以及在注入字段之后,将调用此方法,例如,用@EJB@Resource注释装饰的字段。

由于您使用@ViewScoped bean,因此每个视图将创建一次。刷新页面将创建一个新视图,这就是为什么将重新创建@ViewScoped bean的实例,并且您将以所需语言处理数据。

可能的解决方案:

  • 将处理视图的bean标记为@RequestScoped
  • 使用适当的i18n国际化输出消息。不要依赖从托管bean构造的消息。

就我而言,我会使用后者而不是前者。此外,在更改语言之后,最好的选择是向服务器发出新的非Ajax请求 - 响应周期。

更多信息:

答案 1 :(得分:1)

我试图像过去那样做,但没有运气。以下是我如何解决问题(使用JQuery):

<h:selectOneMenu value="#{client.language}" onchange="$(document).find('.submitBtn').click();" >
     <f:selectItems value="#{client.languages()}" />
</h:selectOneMenu>

<h:commandButton style="visibility: hidden;" styleClass="jsfHidden submitBtn" action="#{yourpostconstructmethod}"/>