2

我正在尝试使用 RichFaces 保留表格的状态。RichFaces 具有 tableState 的此功能,它是有关表的所有信息的 json 字符串。tableState 字符串现在看起来像这样

{"columnsWidthState":{"j_idt433":"140px","j_idt269":"32px","j_idt379":"80px","j_idt424":"200px","j_idt415":"200px","j_idt406":"110px","j_idt375":"115px","j_idt397":"80px","j_idt388":"120px"},"columnsSortState":{"j_idt433":null,"j_idt269":null,"j_idt379":null,"j_idt424":null,"j_idt415":null,"j_idt406":null,"j_idt375":null,"j_idt397":null,"j_idt388":null},"columnsOrderState":["j_idt269","j_idt375","j_idt379","j_idt388","j_idt397","j_idt406","j_idt415","j_idt424","j_idt433"],"columnsFilterState":{"j_idt433":null,"j_idt269":null,"j_idt379":null,"j_idt424":null,"j_idt415":null,"j_idt406":null,"j_idt375":null,"j_idt397":null,"j_idt388":null}}

我很想知道这些标识符是如何生成的,即 j_idt388 等。我尝试将 id 赋予该列,并且 Richfaces tableState 字符串兑现了这一点。tableState json 现在看起来像这样

{"columnsWidthState":{"date":"140px","sessions":"110px","application":"115px","activity":"200px","kvalue":"80px","risk":"80px","account":"120px","riskFactor":"200px","status":"32px"},"columnsSortState":{"date":null,"sessions":null,"application":null,"activity":null,"kvalue":null,"risk":null,"account":null,"riskFactor":null,"status":null},"columnsOrderState":["status","application","account","kvalue","sessions","riskFactor","activity","risk","date"],"columnsFilterState":{"date":null,"sessions":null,"application":null,"activity":null,"kvalue":null,"risk":null,"account":null,"riskFactor":null,"status":null}}

我保留了这个 json 字符串,以便将来如果我登录,我应该会看到与我离开时相同的表状态。

问题是,一旦我注销并登录到我的应用程序。RichFaces 失败并引发异常。这让我觉得它不再能够识别 json 字符串,但我想知道为什么。这是一个例外:

java.lang.NullPointerException: null
at org.richfaces.renderkit.ExtendedDataTableRenderer.encodeHeaderOrFooterCell(ExtendedDataTableRenderer.java:275) ~[richfaces-4.5.13.Final.jar:4.5.13.Final]
at org.richfaces.renderkit.ExtendedDataTableRenderer.encodeHeaderOrFooter(ExtendedDataTableRenderer.java:378) ~[richfaces-4.5.13.Final.jar:4.5.13.Final]
at org.richfaces.renderkit.ExtendedDataTableRenderer.encodeHeader(ExtendedDataTableRenderer.java:466) ~[richfaces-4.5.13.Final.jar:4.5.13.Final]
at org.richfaces.renderkit.ExtendedDataTableRenderer.doEncodeChildren(ExtendedDataTableRenderer.java:725) ~[richfaces-4.5.13.Final.jar:4.5.13.Final]
4

1 回答 1

1

JSF 为元素生成 ID,其中开发人员没有在元素的属性中设置自己的 ID。这会导致在您的第一个代码段中发布以您开头的 ID j_id(例如j_idt433)。您可以在此答案中阅读有关 ID 生成的更多信息。

ID 生成取决于计算元素的数量。因此,如果您保留一个表状态并稍后尝试恢复它,并且表更改之前的元素数量,则 ID 不再正确。这可能会导致您发布的异常。

为了防止这种情况,只需给每个人<rich:column />一个 ID。

于 2016-08-08T12:09:28.977 回答