当使用重定向加载网页时,我在@ViewScoped bean中看不到在@PostConstruct方法中生成的菜单



环境:

  • Jboss 5.2
  • Java 7
  • JSF 2.1.2
  • 底涂层6.2
  • Mojarra(1.2_13-b01-FCS(

我想在ViewScopebean中加载在@PostConstruct方法中生成的菜单,但当加载网页时,菜单是无效的。

页面persona.xhtml是从另一个网页的重定向加载的,PersonaBean具有ViewScope。PersonaBean init((@PostConstruct被执行,但没有在网页中加载任何值。

加载了特定的bean CustomMenuBean(视图范围(,但CustomMenuBean.menu在网页中为null,但它在bean中有菜单(当我在调试模式下停止时,CustomMenuBean.menu被正确加载(。

所以我试着用一个按钮来更新frmMenus以进行测试,在用以下代码刷新网页后,它运行得很好。

<p:commandButton value="update" action="#{personaBean.doNothing}"  process=":frmMenus" update=":frmMenus"/>

网页persones.xhtml

...
<p:dataTable id="lstPersones" var="item" value="#{personesBean.items}"...>
<p:ajax event="rowSelect" listener="#{personesBean.onRowSelect}"/>
...

PersonesBean.java

@ViewScoped
@ManagedBean
public class PersonesBean ...
...
@Override
public void onRowSelect(SelectEvent event) {
...
HttpServletRequest origRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
String ctxPath = origRequest.getContextPath();
FacesContext.getCurrentInstance().getExternalContext().redirect(ctxPath + "gestiopersona.xhtml");
...

网页persona.xhtml

...
<h:form id="frmMenus">
<div class="layout-menu-container #{usuariPreferenciesBean.menuClass}">
<div class="nano">
<div class="nano-content menu-scroll-content">
<ui:include src="menu_profile.xhtml"/>
<pu:menu id="mnu_custom" widgetVar="mnu_custom" model="#{customMenuBean.menu}"/>
<p:separator/>
</div>
</div>
</div>
</h:form>
<h:form id="frmPersona">
<!-- person data -->
</h:form>
...

PersonaBean.java

@ViewScoped
@ManagedBean
public class PersonaBean...
...
@ManagedProperty(value = "#{customMenuBean}")
private CustomMenuBean cstmMenuBean; //View scope Bean to store menu
@PostConstruct
public void init() {
super.init(Persona.class);
super.setService(service);
cstmMenuBean.generateMenu(); //create a DefaultMenuModel()
}
...

我不知道我错过了什么。

这个错误似乎是一种错误,我没有找到解释。

我只是在@PostConstruct托管bean中执行javascript中的一个隐藏按钮。

这不是办法,但它解决了这个补丁的问题。

PersonaBean.java

PrimeFaces.current().executeScript("document.getElementById("frmPersona:btnUpdate").click()");

persona.xhtml

<p:commandButton id="btnUpdate" value="update" action="#{personaBean.doNothing}" process=":frmMenus" update=":frmMenus" style="display:none"/>

看起来像JSF中的错误

更新(2012年12月(:这确实是JSF2中的一个错误。这是一个鸡蛋问题。视图范围的bean存储在JSF视图状态中。因此,视图范围的bean只有在恢复视图阶段之后才可用。但是,binding属性在恢复视图阶段运行,而视图范围的bean还不可用。这导致创建一个全新的视图范围的bean实例,该实例随后被存储在恢复的JSF视图状态中的真实视图范围的bean所取代。

这被报道为JSF问题1492JSF规范issue 787,这将在JSF 2.2中修复。在此之前,您最好只在请求范围的bean上使用绑定,或者为特定的功能需求寻找替代方法。

巴勒斯有一篇文章处理这个问题,或者是一篇非常相似的文章。

相关内容

  • 没有找到相关文章

最新更新