为什么我的SessionScoped ManagedBean在一个地方显示正常而在另一个地方显示为null?

时间:2012-12-06 20:07:55

标签: ajax jsf

以下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时({{在上面的调用中,我的SessionScoped ManagedProperty在方法中被标记为null。 ManagedProperty实际上是一个SessionScoped ManagedBean本身。

无法弄清楚为什么这个代码在一个页面中正常工作但在另一个facelet中,当'set'出现时,ManagedProperty显示为null ...

1 个答案:

答案 0 :(得分:1)

binding属性在绑定到范围比请求范围更广泛的bean的属性时会导致问题,例如会话范围,因为您基本上在多个物理上共享相同的JSF组件状态页面包括整个会话中的页面视图和浏览器选项卡/窗口。摆脱它或将其重新绑定到请求范围的bean。

  

然后将UIInput字段传递给一个方法,该方法将FacesContext消息添加到指定的UIComponent(在这种情况下,它是UIInput字段

根据功能要求使用普通ValidatorConverter,并将其注册到组件上。如果您抛出ValidatorExceptionConverterException,那么包裹的FacesMessage将自动结束在正确的位置。这样您就不再需要组件绑定了。

  

将manager bean设置为RequestScoped修复它...这很奇怪,因为当我将员工托管bean设置为SessionScoped时,ajax功能开始工作

commandButton/commandLink/ajax action/listener method not invoked or input value not updated中的第4点和第5点回答了这个问题。