Я попытался запустить ваш демонстрационный код код в MyFaces 1.2.3 для Tomcat и Mojarra 2.0.0 Beta на Glassfish, но не смог воспроизвести проблему - save () Метод напечатал значения, которые я ввел в поля.
(Чтобы использовать MyFaces, мне пришлось изменить new UIData () на new HtmlDataTable () , вероятно, из-за того, как они реализуют средство визуализации таблиц, но это небольшое изменение .)
Я отмечу пару вещей о бобе:
- средство получения таблицы будет продолжать добавлять столбцы при каждом вызове - как при обновлении страницы с сохранением состояния на стороне сервера
- хранить ссылку на UIComponent в сессионном компоненте обычно не очень хорошая идея; вам лучше использовать область запроса для привязок компонентов
- сессионные компоненты должны реализовывать Serializable (хотя я понимаю, что это делают не все), и UIComponents не могут быть сериализованы
- ваш компонент может оказаться в нескольких представлениях, если пользователь дважды откроет страницу - проблемы с параллелизмом
- в соответствии с spec : когда JSF создает представление, оно будет использовать компонент, связанный через геттер; но когда он восстанавливает представление (при отправке), он устанавливает компонент через установщик, поэтому сохранение ссылки (в лучшем случае) избыточно
Возможно, вы захотите изменить геттер на что-то вроде этого:
private UIData headerDataTable;
public UIData getHeaderDataTable() {
if (headerDataTable == null) {
headerDataTable = new UIData();
getHeaderTable(headerDataTable);
}
return headerDataTable;
}
Я не уверен, что эти изменения решат вашу проблему, однако - если у вас все еще возникают проблемы, попробуйте еще раз с более подробной информацией - вашей реализацией JSF, версией и значением javax. Параметр faces.STATE_SAVING_METHOD в web.xml (если есть).