2012-12-06 30 views
0

以下的facelet代码,当雇员inputText组件失去焦点,成功地执行这使得消息...为什么我的SessionScoped ManagedBean在一个地方显示正常而在另一个地方显示为空?

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

想不通为什么这个代码在一个页面上工作正常,但随后在另一facelet里当“设置”发生ManagedProperty被显示为空...

+1

不确定是否在这种特殊情况下,因为提供的信息不在SSCCE flavor中,而是在比请求范围更广泛的bean上使用'binding'属性是JSF状态问题的配方(物理上现在,同一个组件在同一个会话中的多个请求/视图之间共享!)。摆脱它或将其重新绑定到请求作用域bean并重试。 – BalusC

+0

@BalusC - 该绑定属性位于SessionScoped bean的UIInput字段中。然后将UIInput字段传递给一个方法,该方法将FacesContext消息添加到指定的UIComponent(在这种情况下,它是UIInput字段)。这有什么区别吗? –

+0

@BalusC - 设置管理bean为RequestScoped修复它...这很奇怪,因为当我将我的员工托管bean设置为SessionScoped时,ajax功能开始工作......对此背后原因的任何想法? –

回答

1

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

的UIInput字段然后被传递给,增加了一个FacesContext消息发送到指定的UIComponent(在这种情况下,它的UIInput字段

只需使用一个正常ValidatorConverter取决于一个方法并将其注册到组件上,如果您抛出ValidatorExceptionConverterException,则被包装的FacesMessage将自动结束在正确的位置,这样您就不再需要组件绑定了。

设置管理器bean被RequestScoped固定它...这很奇怪,因为当我把我的员工管理的Bean被SessionScoped,AJAX功能开始工作

这是由点回答在commandButton/commandLink/ajax action/listener method not invoked or input value not updated中的4和5。

+0

有道理 - 谢谢。 –

+0

你知道我如何通过验证器显示成功消息吗?我想为我的组件使用h:message标记,当验证中出现错误或成功时(如果可能的话)...我尝试使用FacesMessage.SEVERITY_INFO获取成功消息,但仍然显示消息为错误.. –

+0

不要将它作为'ValidatorException'丢弃。直接将其添加到上下文中。例如。 'context.addMessage(component.getClientId(context),message)'。 – BalusC

相关问题