【发布时间】:2012-12-06 20:07:55
【问题描述】:
下面的 facelet 代码,当employeeId inputText 组件失去焦点时呈现一条消息,正在成功执行...
<h:inputText id="employeeId" value="#{questionAnswerAction.questionAnswerActionForm.employeeId}"
required="true" requiredMessage="#{app:requiredFieldMessage(bundle, 'label.peoplesoftId')}"
binding="#{questionAnswerAction.questionAnswerActionForm.employeeIdInputText}">
<f:ajax event="blur" render="employeeIdMessage" />
</h:inputText>
<h:message id="employeeIdMessage" errorClass="deg-msg-error" infoClass="deg-msg-info" for="employeeId"></h:message>
尽管出于某种原因,当我尝试在另一个 facelet 上应用几乎相同的代码时(不同之处在于它是针对 managerId 而不是 employeeId),当发生在 ajax 调用中触发的 setter 时(@987654322 @ 在上面的调用中),我的 SessionScoped ManagedProperty 在方法中被标记为 null。 ManagedProperty 实际上是一个 SessionScoped ManagedBean 本身。
无法弄清楚为什么此代码在一个页面中运行良好,但在另一个 facelet 中,当“set”发生时,ManagedProperty 显示为 null...
【问题讨论】:
-
不确定是否是这种特殊情况下的原因,因为提供的信息不是 SSCCE 风格的,但是在范围比请求范围更广的 bean 上使用
binding属性是 JSF 的秘诀状态问题(物理上相同的组件现在在同一会话中的多个请求/视图之间共享!)。摆脱它或将其重新绑定到请求范围的 bean 并重试。 -
@BalusC - 该绑定属性位于 SessionScoped bean 中的 UIInput 字段上。然后将 UIInput 字段传递给将 FacesContext 消息添加到指定 UIComponent(在本例中为 UIInput 字段)的方法。这有什么区别吗?
-
@BalusC - 将管理器 bean 设置为 RequestScoped 已修复...这很奇怪,因为当我将员工托管 bean 设置为 SessionScoped 时,ajax 功能开始工作...关于这背后的原因是什么?