【发布时间】:2011-11-21 10:08:55
【问题描述】:
我在 JBoss 6.1.0 final 上使用 Mojarra 2.0.3。如果在标签中指定了条件渲染,我遇到了 h:selectBooleanCheckbox 的 value setter 方法的问题。
具体来说:
JSF:
<h:selectBooleanCheckbox value="#{somebean.checked}" rendered="#{somebean.render}" />
示例 bean 代码:
private Boolean checked = new Boolean(false);
public Boolean getChecked() {return checked;}
public void setChecked(Boolean checked) {this.checked = checked;}
public boolean getRender() {return true;}
问题是提交表单时永远不会调用 setChecked() 方法。如果我删除“rendered”属性,setter 将按预期调用。只有当标签被有条件地呈现时,它才不会在提交时被处理。无论哪种情况,都会正常调用 getter。
如果我设置了 valueChangeListener,如果 selectBooleanCheckbox 有条件地呈现,则也不会调用它。最后,将 h:selectBooleanCheckbox 标记包含在像 :panelGrid 这样的容器中并在“外部”组件上设置条件渲染会导致相同的行为。如果有条件渲染,似乎不会处理复选框。
这似乎是一种基本的东西,所以我假设我缺少一些东西。有没有人有类似的经历?
更新:本例中的托管 bean 是 CDI ConversationScoped bean。进一步的调试似乎表明 bean 的另一个实例在 JSF 生命周期的某个地方实例化并使用了。所以我修改了 bean 以在 postConstruct 方法中将对话设置为非瞬态。这导致 JSF 在评估“rendered”属性中使用的 EL 表达式时抛出以下异常:
23:41:12,179 WARNING[javax.enterprise.resource.webcontainer.jsf.lifecycle] /admin/edit_user_profile.xhtml @41,72 rendered="#{profileEditor.isCurrentUser}": java.lang.IllegalStateException: javax.el.ELException: /admin/edit_user_profile.xhtml @41,72 rendered="#{profileEditor.isCurrentUser}": java.lang.IllegalStateException
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111) [:2.0.3-]
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190) [:2.0.3-]
at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:417) [:2.0.3-]
.
.
.
Caused by: java.lang.IllegalStateException
at com.sun.faces.context.FacesContextImpl.assertNotReleased(FacesContextImpl.java:635) [:2.0.3-]
at com.sun.faces.context.FacesContextImpl.getExternalContext(FacesContextImpl.java:135) [:2.0.3-]
at com.sgi.tds.web.admin.beans.TdsAdminBean.getCurrentUser(TdsAdminBean.java:36) [:]
at com.sgi.tds.web.admin.beans.UserProfileEditorBean.getIsCurrentUser(UserProfileEditorBean.java:153) [:]
at com.sgi.tds.web.admin.beans.UserProfileEditorBean$Proxy$_$$_WeldClientProxy.getIsCurrentUser(UserProfileEditorBean$Proxy$_$$_WeldClientProxy.java) [:]
【问题讨论】:
-
实际上我在 Primefaces 中的深层嵌套也有同样的问题,
渲染得很好,而 渲染失败(总是假的)。一般来说,巴鲁斯是对的——但我在深巢中注意到了这种行为。我对复制它的完整简单测试用例感兴趣,我指责 Primefaces 引擎中的渲染顺序,但它可能更微妙。
标签: jsf