Edited/updated rowEdit 中的 p:dataTable 值在侦听器方法中不可用,因为它们正在被数据库中的现有数据覆盖
Edited/updated values in p:dataTable rowEdit are not available in listener method as they are being overwritten by existing data from database
我正在使用 <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>
backing bean 实现如下。
private List<User> users;
@EJB
private UserService userService;
public List<User> getUsers() {
users = userService.list();
return users;
}
当我在 cellEditor 中输入新数据并提交时,它们在侦听器方法中不可用。我注意到它们被从数据库调用的数据覆盖了。
为什么会发生这种情况,我该如何避免?
您的问题是由在 getter 方法中执行业务逻辑引起的。对数据 table 的每次迭代都会调用 getter 方法。因此,当 JSF 忙于遍历数据 table 以便在模型中设置提交的值时,getter 一次又一次地从 DB 调用 returns 一个新列表。
您不应该在 getter 方法中执行业务逻辑。只要你是初学者,你最好不要接触 getter(和 setter)方法,并在其他地方使用一次性调用的方法完成工作。
您可能需要 @PostConstruct
(和真正的 service/DAO class):
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!
}
另请参阅:
- Why JSF calls getters multiple times
我正在使用 <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>
backing bean 实现如下。
private List<User> users;
@EJB
private UserService userService;
public List<User> getUsers() {
users = userService.list();
return users;
}
当我在 cellEditor 中输入新数据并提交时,它们在侦听器方法中不可用。我注意到它们被从数据库调用的数据覆盖了。
为什么会发生这种情况,我该如何避免?
您的问题是由在 getter 方法中执行业务逻辑引起的。对数据 table 的每次迭代都会调用 getter 方法。因此,当 JSF 忙于遍历数据 table 以便在模型中设置提交的值时,getter 一次又一次地从 DB 调用 returns 一个新列表。
您不应该在 getter 方法中执行业务逻辑。只要你是初学者,你最好不要接触 getter(和 setter)方法,并在其他地方使用一次性调用的方法完成工作。
您可能需要 @PostConstruct
(和真正的 service/DAO class):
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!
}
另请参阅:
- Why JSF calls getters multiple times