Отредактированные / обновленные значения в 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!
}

Смотрите также:

Другие вопросы по тегам