表的Vaadin Bean验证

时间:2013-07-29 08:48:35

标签: vaadin vaadin7

当我进入表格的编辑模式时,我希望对该表格中的所有字段进行数据验证

首先,几个笔记:

  • 我正在使用Vaadin 7,因此Bean Validation插件可能无法正常工作。
  • 我知道JSR-303的实现有效,因为我尝试将BeanValidator添加到TextField而没有问题。

现在,我有一个完美的工作表,我正在使用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"));

当我运行应用程序时,我有两个问题:

  1. 运行应用程序时,表格按预期显示。但是,当我编辑字段并将firstName字段之一设置为“abc”时 - 不显示验证错误并且接受该值 我应该如何让BeanValidator在我的所有表格字段上工作?

  2. 当我使用table.setSelectable(true)或table.setMultiSelect(true)时,我收到此错误:

      

    com.vaadin.server.ServiceException:   java.lang.IllegalArgumentException:[]不是有效值   属性类的类firstName   com.some.path.vaadinpoc.sampleapp.web.Person   我如何让BeanValidator与Selectable / MultiSelect一起使用?

  3. 请咨询

    谢谢!

1 个答案:

答案 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;
  }