Отредактированные / обновленные значения в p:dataTable rowEdit недоступны в методе слушателя, поскольку они перезаписываются существующими данными из базы данных.
Я редактирую данные с <p:dataTable>
редактор строк, как показано ниже.
<p:dataTable value="#{bean.users}" var="user" editable="true">
<p:ajax event="rowEdit" listener="#{bean.onRowEdit}" />
<p:ajax event="rowEditCancel" listener="#{bean.onRowEditCancel}" />
<p:column>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{user.firstName}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{user.firstName}" />
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
Поддерживающий компонент реализован, как показано ниже.
private List<User> users;
@EJB
private UserService userService;
public List<User> getUsers() {
users = userService.list();
return users;
}
Когда я ввожу новые данные в cellEditor и отправляю их, они недоступны в методе слушателя. Я заметил, что они перезаписываются данными из базы данных.
Почему это происходит и как я могу избежать этого?
1 ответ
Ваша проблема вызвана выполнением бизнес-логики в методе получения. Каждая итерация таблицы данных вызывает метод getter. Итак, пока JSF занят итерацией по таблице данных, чтобы установить отправленные значения в модели, вызовы геттера снова и снова возвращают новый список из БД.
Вы не должны выполнять бизнес-логику в методе получения. Пока вы начинающий, вам лучше воздержаться от прикосновения к методам получения (и установки) и выполнять работу в другом месте с помощью одноразового метода.
Вам скорее всего нужен @PostConstruct
(и настоящий сервис / класс DAO) здесь:
private List<User> users;
@EJB
private UserService userService;
@PostConstruct
public void init() {
users = userService.list(); // Call the DB here.
}
public List<User> getUsers() {
return users; // Just return the already-prepared model. Do NOT do anything else here!
}