Ошибка таблицы RichFaces ExtendedDataTable со сгенерированным идентификатором

Я пытаюсь сохранить состояние таблицы с помощью 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 и т. Д. Я попытался указать идентификатор столбца, и строка tableState richfaces соблюдала это. 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]

person Nick01    schedule 29.06.2016    source источник


Ответы (1)


JSF генерирует идентификаторы для элементов, для которых разработчик не установил свой собственный идентификатор в атрибуте элемента. Это приводит к тому, что идентификаторы начинаются с j_id, которые вы разместили в своем первом фрагменте кода (например, j_idt433). Вы можете узнать больше о создании идентификатора в этом ответе.

Генерация идентификатора зависит от подсчета количества элементов. Таким образом, если вы сохраните состояние таблицы, а затем попытаетесь восстановить его, а также количество элементов до изменения таблицы, идентификаторы больше не будут правильными. Это может привести к исключению, которое вы опубликовали.

Чтобы предотвратить это, просто дайте каждому <rich:column /> идентификатор.

person Bob    schedule 08.08.2016