【问题标题】:JSF 2.2 @ViewScoped binding bug?JSF 2.2 @ViewScoped 绑定错误?
【发布时间】: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;

标签: jsf binding view-scope jsf-2.2


【解决方案1】:

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

【讨论】:

  • 好的,这只是您自己的代码/测试方法中的一个错误;)顺便说一句,使用 JSF 2.2,您不需要禁用部分状态保存来修复视图范围 bean 的错误每次都在重建。当您仍在使用 JSF 2.0/2.1 时,此设置仅用作“临时解决方法”。
  • 是的,我通过使用另一个 Cliente 属性“selectedCliente”修复了它。并删除了部分状态保存修复。谢谢。
猜你喜欢
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2014-08-30
  • 2015-05-02
相关资源
最近更新 更多