0

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

无法弄清楚为什么此代码在一个页面中运行良好,但在另一个 facelet 中,当“set”发生时,ManagedProperty 显示为 null ...

4

1 回答 1

2

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

然后将 UIInput 字段传递给将 FacesContext 消息添加到指定 UIComponent 的方法(在本例中为 UIInput 字段

只需使用普通ValidatorConverter根据功能要求并将其注册到组件上。如果你抛出一个ValidatorExceptionor ConverterException,那么被包裹的FacesMessage东西会自动出现在正确的位置。这样你就不再需要组件绑定了。

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

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

于 2012-12-07T16:59:02.667 回答