我尝试在 Grid
表上为 User
实体创建常规 CRUD 操作 - 如下所示:
public class User {
private id;
private String name
private Role role;
}
具有适当的 getter 和 setter。
Grid
应有 2 个字段:name
和role.name
。我想为该
Grid
创建一个数据IndexedContainer
我想进行更新 - 这会将容器的数据绑定(bind)到
User
模型。- 我所说的模型是指
User
实体,而不是Vaadin的内部模型
- 我所说的模型是指
我怎样才能做到这一点?我有两件事有问题:
- 创建适当的监听器
- 将现有的
User
模型绑定(bind)到数据IndexedContainer
中的行/索引
说明:
IndexedContainer
具有itemId
属性,我可以在其中保留用户的 ID 以供将来更新时绑定(bind)。但是在IndexedContainer
上创建ValueChangeListener
后,我发现我无法访问其itemId
字段。所以我尝试在
EditorFieldGroup
(Grid
对象的字段)中使用CommitHandler
,并且存在相同的情况,但我请参阅 debug made 中的itemId
属性,但我无法访问它,因为它是私有(private)字段。我当然可以通过反射(reflection)来获得它 - 但我不认为这是一个好方法。
也许还有其他方法可以从Grid
表格数据更新User
模型?
也许我应该将User
id 字段作为常规IndexedContainer
属性添加到网格中,但使其隐藏且只读?但我想知道它是否安全,并且不存在有人更改前端表单并可以使用 Grid
表上未显示的 id 更新 User
的威胁。
如果有人知道该典型案例的最佳实践是什么,请告诉我。我将非常高兴您的帮助!
最佳答案
使用可编辑网格组件时,您将需要使用FieldGroup
。在您的情况下,您可以使用 BeanFieldGroup。如果您有正确的 getter/setter 方法,BeanFieldGroup
可以在用户更改并保存网格中的数据时负责更新您的实体实例。以下是一个小代码片段:
grid.setEditorFieldGroup(
new BeanFieldGroup<Person>(User.class));
此外,您可以使用标准 @NotNull
、@Size
、@Min
为您的 User
实体添加验证>、@Max
等
有关更多信息,请查看 vaadin 网站的书籍。希望这有帮助!
关于java - 如何更新 Vaadin 网格上的项目而不显式放置所有字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30350801/