1

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

首先,有几点注意事项:

  • 我正在使用 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...
}

将 Person bean 添加到 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: [] is not a valid value for property firstName of type class com.some.path.vaadinpoc.sampleapp.web.Person 我应该如何让 BeanValidator 使用可选择/多选?

请指教

谢谢!

4

1 回答 1

4

您需要将验证器添加到可编辑字段本身,而不是表中。(表本身是一个字段 => Validator 来自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;
  }
于 2013-07-29T11:07:59.023 回答