我正在使用Vaadin BeanValidationBinder。
如果我绑定这样的字段:
binder.forField(email).bind("email");
然后验证工作。
如果我像这样绑定字段:
binder.forField(email).bind(PersonDTO::getEmail, PersonDTO::setEmail);
然后它不起作用(没有尝试验证)
我更喜欢后一种形式,因为它更明确,更不容易出错,但为什么验证不起作用,我怎样才能让它发挥作用?
我在字段,getter和setter上尝试了@Email
注释。使用setter上的注释会导致异常,但在字段或getter上使用注释会产生如上所述的效果。
答案 0 :(得分:1)
我没有仔细查看消息来源以确切了解这些消息的确切位置,但如果您考虑一下它会有所帮助:
binder.bind("name")
的字段,框架能够检查它并推断出相关的注释,从而评估新值ValueProvider
&使用Setter
的binder.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并自行进行验证。