【问题标题】:Why is my SessionScoped ManagedBean showing up fine in one place and null in another?为什么我的 SessionScoped ManagedBean 在一个地方显示正常而在另一个地方显示为空?
【发布时间】: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 功能开始工作...关于这背后的原因是什么?

标签: ajax jsf


【解决方案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 点回答了这个问题。

【讨论】:

  • 您知道如何通过验证器显示成功消息吗?我想为我的组件使用 h:message 标记,以便在验证中出现错误或成功时使用……我尝试使用 FacesMessage.SEVERITY_INFO 作为成功消息,但仍将消息指示为错误。 .
  • 不要把它扔成ValidatorException。直接将其添加到上下文中。例如。 context.addMessage(component.getClientId(context), message).
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2017-03-19
  • 2022-10-01
  • 2021-09-06
  • 1970-01-01
  • 2021-10-08
相关资源
最近更新 更多