angle-left

Primefaces таблица показывает старые данные

В этой короткой заметке расскажу интересный кейс, с которым я столкнулся при реализации нового функционала для существующего интерфейса в приложении, написанном на JSF с использованием Primefaces. Описание проблемы такое. Предположим, что у нас есть набор фильтров или какая-то форма, которая должна по нажатию. на кнопку вызвать метод на стороне сервера и отфильтровать таблицу. Пример таблицы ниже.

 

 

Проблема была в том, что при нажатии на кнопку, которая вызывает submit формы, ничего не происходило. Увидев это, я предположил, что у кнопки неправильно указан атрибут update. Я тщательно всё проверил. update был написан верно. После этого я стал проверять, а вызывается ли вообще action на сервере? Он тоже вызывался. Метод был написан правильно. Он возвращал новый список. Список был не пустой. Но по каким-то причинам таблица не хотела менять своё содержимое. В чём же проблема?

 

 

Как оказалось, проблема была следующая. У меня была следующая строка кода

myList = fromDB.loadAnotherContent();

А в xhtml странице datatable была привязана к полю бина myList. И что же происходило в этой строке?  К переменной привязывался новый объект. НО! Но, как оказалось, компонент primefaces datatable запоминал объект, переданный ему в el expression и сохранял ссылку на него внутри себя. Поэтому, когда мы присваеваем полю бина ссылку на новый объект, то сама таблица об этом не узнает.

Для решения этой проблемы необходимо заменить присваивание на строки следующего вида

myList.clear();
myList.addAll(fromDB.loadAnotherContent());

В этом и заключается решение такой простой, но не совсем очевидной проблемы.

На этом, пожалуй, откланяюсь! Спасибо за прочтение этой заметки. 

Вперед