以下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 ...
答案 0 :(得分:1)
binding
属性在绑定到范围比请求范围更广泛的bean的属性时会导致问题,例如会话范围,因为您基本上在多个物理上共享相同的JSF组件状态页面包括整个会话中的页面视图和浏览器选项卡/窗口。摆脱它或将其重新绑定到请求范围的bean。
然后将UIInput字段传递给一个方法,该方法将FacesContext消息添加到指定的UIComponent(在这种情况下,它是UIInput字段
根据功能要求使用普通Validator
或Converter
,并将其注册到组件上。如果您抛出ValidatorException
或ConverterException
,那么包裹的FacesMessage
将自动结束在正确的位置。这样您就不再需要组件绑定了。
将manager bean设置为RequestScoped修复它...这很奇怪,因为当我将员工托管bean设置为SessionScoped时,ajax功能开始工作
commandButton/commandLink/ajax action/listener method not invoked or input value not updated中的第4点和第5点回答了这个问题。