环境:
- 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问题1492和JSF规范issue 787,这将在JSF 2.2中修复。在此之前,您最好只在请求范围的bean上使用绑定,或者为特定的功能需求寻找替代方法。
巴勒斯有一篇文章处理这个问题,或者是一篇非常相似的文章。