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>

支持Bean的实现方式如下。

private List<User> users;
@EJB
private UserService userService;
public List<User> getUsers() {
    users = userService.list();
    return users;
}

当我在单元格编辑器中输入新数据并提交时,它们在侦听器方法中不可用。我注意到它们被从数据库中调用的数据覆盖。

为什么会发生这种情况,我该如何避免?

您的问题是由在 getter 方法中执行业务逻辑引起的。对数据表的每次迭代都将调用 getter 方法。因此,当 JSF 忙于迭代数据表以在模型中设置提交的值时,getter 调用一次又一次地从 DB 返回一个新列表。

您不应该在 getter 方法中执行业务逻辑。只要您是初学者,您最好不要接触 getter(和 setter)方法,并在其他地方以一次性调用的方法执行工作。

您可能需要一个@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!
}

另请参阅:

  • 为什么 JSF 多次调用 getter

相关内容

  • 没有找到相关文章

最新更新