powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / RichFaces, ViewScopped bean и rich:fileUpload
8 сообщений из 8, страница 1 из 1
RichFaces, ViewScopped bean и rich:fileUpload
    #37724398
Африканец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi All,

Есть JSF 2.0 (Mojarra 2.1.6), RichFaces 4.1.0.

Задача: получить с веб-формы XLS-файл, распарсить его, показать содержимое, а затем записать в базу.

Для загрузки файла используется следующий код на странице:

Код: xml
1.
2.
3.
			<rich:fileUpload fileUploadListener="#{selectionBean.uploadListener}" id="upload" acceptedTypes="xls, xlsx" 
               		ontyperejected="alert('Only XLS and XLSX files are accepted');" maxFilesQuantity="1" render="recordsPanel, save">
           		</rich:fileUpload>



Файл без проблем парсится следующим методом бина (ViewScoped, т.е. должен сохранять состояние, пока не вышли за пределы страницы):

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
	
    public void uploadListener(FileUploadEvent event) throws Exception {
        UploadedFile item = event.getUploadedFile();
        FileInputStream fis = (FileInputStream)item.getInputStream();

       	setRecords( SelectionUtils.parseRNEC( fis ) );

        fis.close();
    }



Однако при нажатии на кнопку "Save"

Код: xml
1.
<a4j:commandButton id="save" type="button" value="Save Records" action="#{selectionBean.saveRecords}"/>



почему-то RF подгружает состояние бина, сохраненное ДО вызова uploadListener(), так что поле records обнуляется, и записывать в базу нечего.

Что я делаю не так? Есть ли способ заставить сохранить состояние после получения records? Если сменить scope на session - все работает.

Страница и бин приложены в аттаче (геттеры/сеттеры опущены для экономии).
...
Рейтинг: 0 / 0
RichFaces, ViewScopped bean и rich:fileUpload
    #37724400
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лениво искать, но это полубаг полуфича, заставить работать в скопе вью или конверсейшн у вас врядли получится, только сешн
...
Рейтинг: 0 / 0
RichFaces, ViewScopped bean и rich:fileUpload
    #37724406
Африканец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник,

А можно как-то принудительно записать состояние для SessionScoped бина? Иначе нафиг он такой красивый нужен, если ничего не помнит, кроме полей формы (и те с формы берет)
...
Рейтинг: 0 / 0
RichFaces, ViewScopped bean и rich:fileUpload
    #37725623
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем понимаю, что значит авторА можно как-то принудительно записать состояние для SessionScoped бина?

Я делал так, но у меня был Seam2 и Richafces3, хотя не особо важно. В общем в методе файлаплоадлистенера я вычитываю файл, паршу его, создаю Holder для данных, и выкидываю этот Holder через аннотацию @Out в session scope, потом в любом другом месте я мог инжектнуть его через аннотацию @In. А что вам надо я не совсем пока понимаю.
...
Рейтинг: 0 / 0
RichFaces, ViewScopped bean и rich:fileUpload
    #37725769
Африканец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник,

Я имел в виду следующее:

Мой ViewScoped бин реализует Serializable, следовательно - RF его сохраняет и восстанавливает время от времени (куда-то типа session или в другой аналогичный контекст); таким образом, при ajax-вызове я имею дело с восстановленным бином.

Я понял, что при вызове actionListener'а для fileUpload бин не сохраняется, т.к. список записей, который я получил в этом методе, не виден в следующем ajax-вызове. Вопрос: можно ли как-то принудительно заставить бин сохраниться при вызове actionListener'а?

Более обще: при каких ajax-вызовах со страницы ViewScoped бин сохраняется, а при каких - нет? Есть ли способы гарантированно заставить его сохраняться/не сохраняться?

Ваше решение понятно, но это своего рода "затаптывание" проблемы
...
Рейтинг: 0 / 0
RichFaces, ViewScopped bean и rich:fileUpload
    #37725822
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМой ViewScoped бин реализует Serializable, следовательно - RF его сохраняет и восстанавливает время от времени (куда-то типа session или в другой аналогичный контекст); таким образом, при ajax-вызове я имею дело с восстановленным бином.
не RF сохраняет, а JSF или Seam.

Африканецзабыл ник,

Я понял, что при вызове actionListener'а для fileUpload бин не сохраняется, т.к. список записей, который я получил в этом методе, не виден в следующем ajax-вызове. Вопрос: можно ли как-то принудительно заставить бин сохраниться при вызове actionListener'а?


Бин сохраняется, но не в том скоупе. По какой-то причине метод вызываемый на сервере во время файлаплоадинга, не может подцепить view и conversation-scoped бины, я предполагаю, что RF тупо не передает параметр cid, и неправильно посылает свой viewId, например рандомно добавляет что-то, потому как если использовать session, то как вы заметили все работает нормально. Так как механизмы view и conversation - спрятаны от рук программистов, не видится возможным вклиниться в этот процесс. Думаю теоретически можно продебажить эти механизмы и написать грязнейший хак, но это на любителя, поэтому в общем случае механизм работы такой - разнести view scoped бин и fileuploadListener в разные классы, а в методе fileuploadListenerа вычитывать данные и сохранять их в session scope.

авторБолее обще: при каких ajax-вызовах со страницы ViewScoped бин сохраняется, а при каких - нет? Есть ли способы гарантированно заставить его сохраняться/не сохраняться?
Он должен сохраняться при ВСЕХ вызовах, ваша проблема специфична к компоненту fileUpload, потому что при вычитке данных, он внутри себя создает реквест, который идет вразрез с механизмом view scoped.
...
Рейтинг: 0 / 0
RichFaces, ViewScopped bean и rich:fileUpload
    #37726245
Африканец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник,

Большое спасибо за разъяснения.

забыл никавторБолее обще: при каких ajax-вызовах со страницы ViewScoped бин сохраняется, а при каких - нет? Есть ли способы гарантированно заставить его сохраняться/не сохраняться?
Он должен сохраняться при ВСЕХ вызовах, ваша проблема специфична к компоненту fileUpload, потому что при вычитке данных, он внутри себя создает реквест, который идет вразрез с механизмом view scoped.

Мне случалось наблюдать этот эффект и в других местах (JSF+RF), где не было fileUpload. Видимо, действительно надо в таких случаях создавать отдельный бин в session и валить туда всё, что должно быть доступно странице и бину, но на форму не выкладывается.

А вообще - было бы интересно пообщаться с разработчиками RF на эту тему...
...
Рейтинг: 0 / 0
RichFaces, ViewScopped bean и rich:fileUpload
    #37726302
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМне случалось наблюдать этот эффект и в других местах (JSF+RF), где не было fileUpload. Видимо, действительно надо в таких случаях создавать отдельный бин в session и валить туда всё, что должно быть доступно странице и бину, но на форму не выкладывается.
А можно поподробнее? Я таких ситуаций не встречал, если есть возможность опишите - будет интересно, хотя если честно думаю там могли быть другие ошибки. Особенность файлаплоад компонента в том, что он сам генерит реквесты, еще теоретически возможны проблемы с a4j:push, но я о таких не слышал.

авторА вообще - было бы интересно пообщаться с разработчиками RF на эту тему...
Ну собственно я сам бывший разработчик RF и приложил руку в том числе и к файлаплоаду, правда по UI части.
Дело в том, что как я уже указывал, RF абсолютно перпендикулярна к вопросу сохранения\получения бинов из контекста, все отдается на откуп JSF или фреймворков наподобие Seam, они посредством аннотаций, EL-биндинга и настройки facesContextа управляет жизненным циклом и участвуют в поисках view-scoped бинов. Просто возможно файлаплоад непреднамеренно делает что-то несовместимое с этим скоупингом, хз.. Я отошел от этих дел уже, но будет время может и продебажу, самому интересно, с этим вопросом сталкивался давно, но не было времени изучить подробно.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / RichFaces, ViewScopped bean и rich:fileUpload
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]