JSF 2.2 @ViewScoped 绑定错误?

Posted

技术标签:

【中文标题】JSF 2.2 @ViewScoped 绑定错误?【英文标题】:JSF 2.2 @ViewScoped binding bug? 【发布时间】:2012-06-09 18:13:12 【问题描述】:

我已经阅读了@ViewScoped (BUG REPORT) 的绑定错误,并且它已在最新版本的 JSF 中修复,因此我使用 3 个最新版本的 JSF 对此进行了测试并尝试使用

  <context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>false</param-value>

修复解决它,但没有运气。

我有一个 primefaces 数据表,其中每个列标题中都有过滤器。

        <p:column id="cpfHeader" sortBy="#cliente.nrCpf"
        filterMatchMode="contains">
        <f:facet name="header">
            <h:panelGrid columns="1">
                <h:outputText value="CPF" />
                <p:inputText value="#cadastroClienteBean.cliente.nrCpf">

                </p:inputText>
                <p:commandButton
                    actionListener="#cadastroClienteBean.getClientesBusca"
                    update="#form:tabelaCliente:tblCliente" value="Filtrar"></p:commandButton>
            </h:panelGrid>
        </f:facet>
                #cliente.nrCpf                
            </p:column>

在更改 JSF 版本之前,每次单击“过滤器”按钮时,都会创建一个新的 cadastroClienteBean 实例。现在我已经更改了它,似乎 ManagedBean 不是每次都被实例化,但是 cliente 变量正在变为 null,即使我在构造函数上实例化它。

    public CadastroClienteBean()
    cliente = new Cliente();
    init();

编辑:在调试了一下之后,我发现过滤器的值被设置在变量上,然后 setCliente() 被调用并将其设置为 null,但我不知道为什么。

【问题讨论】:

您是否标记了client 属性transient?你不应该。 不,我没有@ManagedBean @ViewScoped public class CadastroClienteBean implements Serializable /** * */ private static final long serialVersionUID = 1L; private List&lt;Cliente&gt; clientes; private Cliente cliente; private String valor; 【参考方案1】:

弄清楚发生了什么,dataTable 上的 selection="#cadastroClienteBean.cliente" 属性将客户端设置为 null,因为没有选择任何行。

【讨论】:

好的,这只是您自己的代码/测试方法中的一个错误;)顺便说一句,使用 JSF 2.2,您不需要禁用部分状态保存来修复视图范围 bean 的错误每次都在重建。当您仍在使用 JSF 2.0/2.1 时,此设置仅用作“临时解决方法”。 是的,我通过使用另一个 Cliente 属性“selectedCliente”修复了它。并删除了部分状态保存修复。谢谢。

以上是关于JSF 2.2 @ViewScoped 绑定错误?的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.2 内存消耗:为啥 Mojarra 将最后 25 个视图的 ViewScoped Beans 保留在内存中?

使用 JSF 2.2 时在每个回发请求上重新创建 @ViewScoped bean

JSF 复杂表单 - 绑定错误

JSF 2.x @ViewScoped 托管 bean 线程安全吗?

没有@ViewScoped的JSF

在 JSF 中如何以及何时销毁 @ViewScoped bean?