Хорошо, разместите его здесь, потому что он будет длиннее, чем комментарии.
Это работает для меня, что, вероятно, не то, что вы хотели услышать :( но мне пришлось сказать несколько мелких вещей. Во-первых, в контроллер добавить
public void storeItems(Item item)
{
dao.storeItems();
}
затем измените это
<a4j:commandButton action="#{dao.storeItem(item)}" value="Save" render="@form"/>
до
<a4j:commandButton action="#{itemController.storeItem(item)}" value="Save" render="@form"/>
Это, вероятно, не является реальной проблемой, и я думаю, что это где-то здесь
CSVImporter.doImport(item.getInputStream(), dao, item.getName());
В основном я ожидаю, что вышеприведенный метод загрузит данные, откуда dao.getItems();
сможет их получить. Поэтому установите точку останова на public List<Item> getItems()
, и как только файл будет загружен, и render="items message"
снова отобразит группу панелей элементов, он должен будет запустить этот метод и в этот момент посмотреть, возвращает ли dao.storeItems()
какие-либо данные обратно, что и должно. Ответьте тогда, и мы возьмем это оттуда.
Обновление ниже, чтобы избежать двойного запуска dao fetch.
Вы не можете избежать двух вызовов вашего get, которые являются частью JSF lifeCycle и являются нормальными.
Как бы то ни было, вы можете избегать двойного попадания в базу данных, как и следовало бы, но рефакторинг вашего кода должен выглядеть так:
private List<Item> items;
public List<Item> getItems()
{
return items;
}
@PostConstruct
public void init()
{
this.items = dao.getItems();
}
public void uploadListener(FileUploadEvent event) throws Exception{
......
CSVImporter.doImport(item.getInputStream(), dao, item.getName());
this.items = dao.getItems();
.....
}