当我进入表格的编辑模式时,我希望对该表格中的所有字段进行数据验证。
首先,几个笔记:
现在,我有一个完美的工作表,我正在使用BeanItemContainer来保持我的Person bean。
Person bean如下所示:
public class Person {
@Size(min = 5, max = 50)
private String firstName;
@Size(min = 5, max = 50)
private String lastName;
@Min(0)
@Max(2000)
private int description;
... getters + setters...
}
将Bean Bean添加到BeanItemContainer中,而BeanItemContainer又使用setContainerDataSource()
设置为容器数据源BeanValidator已添加到表中,如下所示:
table.addValidator(new BeanValidator(Person.class, "firstName"));
当我运行应用程序时,我有两个问题:
运行应用程序时,表格按预期显示。但是,当我编辑字段并将firstName字段之一设置为“abc”时 - 不显示验证错误并且接受该值 我应该如何让BeanValidator在我的所有表格字段上工作?
当我使用table.setSelectable(true)或table.setMultiSelect(true)时,我收到此错误:
com.vaadin.server.ServiceException: java.lang.IllegalArgumentException:[]不是有效值 属性类的类firstName com.some.path.vaadinpoc.sampleapp.web.Person 我如何让BeanValidator与Selectable / MultiSelect一起使用?
请咨询
谢谢!
答案 0 :(得分:4)
您需要将验证器添加到可编辑字段本身,而不是表格中。 (表本身是一个字段=>来自table.addValidator
的验证器验证表的值=>表的值是所选的itemId(s)=> BeanValidator失败)
您可以通过在表上使用自定义TableFieldFactory将验证器添加到字段中。对于这种情况,这是一个非常简单的一次性示例 - 显然,如果您需要使用许多不同的bean /表来执行此操作,那么创建更通用/可自定义的工厂是值得的
table.setTableFieldFactory(new DefaultFieldFactory() {
@Override
public Field<?> createField(Item item, Object propertyId, Component uiContext) {
Field<?> field = super.createField(item, propertyId, uiContext);
if (propertyId.equals("firstName")) {
field.addValidator(new BeanValidator(Person.class, "firstName"));
}
if (propertyId.equals("lastName")) {
field.addValidator(new BeanValidator(Person.class, "lastName"));
}
if (propertyId.equals("description")) {
field.addValidator(new BeanValidator(Person.class, "description"));
}
return field;
}