Vaadin BeainValidationBinder& JSR 303验证

时间:2018-03-20 20:01:06

标签: validation vaadin

我正在使用Vaadin BeanValidationBinder。

如果我绑定这样的字段:

binder.forField(email).bind("email");

然后验证工作。

如果我像这样绑定字段:

binder.forField(email).bind(PersonDTO::getEmail, PersonDTO::setEmail);

然后它不起作用(没有尝试验证)

我更喜欢后一种形式,因为它更明确,更不容易出错,但为什么验证不起作用,我怎样才能让它发挥作用?

我在字段,getter和setter上尝试了@Email注释。使用setter上的注释会导致异常,但在字段或getter上使用注释会产生如上所述的效果。

2 个答案:

答案 0 :(得分:1)

我没有仔细查看消息来源以确切了解这些消息的确切位置,但如果您考虑一下它会有所帮助:

  • 使用带有binder.bind("name")的字段,框架能够检查它并推断出相关的注释,从而评估新值
  • 使用ValueProvider&使用Setterbinder.bind(PersonDTO::getEmail, PersonDTO::setEmail),您可以提供任何可能不一定操纵字段的方法实现,尽管通常情况并非如此。例如(不是最亮的,但你明白了),你允许用户在TextField中输入一系列逗号分隔值,然后在内部拆分并保存到列表中。

在您的情况下,您可以做的是明确地向绑定添加特定的email validator

binder.forField(email)
      .withValidator(new EmailValidator("Please provide a valid e-mail address"))
      .asRequired("Please provide a valid e-mail address")
      .bind(PersonDTO::getEmail, PersonDTO::setEmail);

答案 1 :(得分:0)

不幸的是,您尝试进行绑定的方式不受内置BeanValidation支持的支持。 Vaadin中受限制的JSR 303支持仅适用于基于命名的绑定。 Vaadin JSR 303仅支持属性级绑定,不使用基于命名约定的绑定,框架无法将错误连接到相关字段。

如果您可以在通用位置单独显示错误,例如靠近保存按钮,我建议您直接使用JSR 303 API并自行进行验证。