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<Cliente> 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