2013-04-23 118 views
2

嗨,我刚刚开始Vaadin 7,并得到了BeanValidator工作。但是,我有一些问题。我使用的代码如下:Vaadin 7验证(BeanValidator和setrequired)

BeanItem<RegisterBean> item = new BeanItem<RegisterBean>(new RegisterBean()); 
final FieldGroup binder = new FieldGroup(item); 
final TextField email = new TextField("email"); 
email.addValidator(new BeanValidator(RegisterBean.class, "email")); 

验证使用BeanValidator罚款。通过@NotNull标签,我也可以验证Null值。不过,我想给用户一些直观的线索,表单中的字段不能留空。对于这一点,我用:

email.setRequired(true); 

然而,加入setRequired的BeanValidation的形式将不再有效后?

这是一个限制吗? 我如何解决它?

+0

对于不应该留空的字符串字段,请在预期的bean字段上使用'@ NotEmpty'注释。 – SashikaXP 2015-03-16 12:09:17

回答

2

您应该可能依靠bean验证本身并使用fieldgroup。

我的模型如下所示:

@NotNull(message="Please enter a valid email address.") 
@Email(message="Please enter a valid email address.") 
@Size(min = 3, max = 255, message="Please enter a valid email address.") 
@Column(name="P_EMAIL", nullable=true, length=255) 
private String email; 

您认为做任何buildAndBind

Field<?> email = binder.buildAndBind("email"); 

或者使用注释@PropertyId("email")在你的领域声明。剩下的就是魔法。

而不是FieldGroup使用BeanFieldGroup

问题在于初步验证。所以点击安装验证器。在这里可以找到更多的主题:http://morevaadin.com/content/bean-validation-and-vaadin-comprehensive-example/

+0

谢谢。这实际上是一个非常好的解释。您能否详细介绍一下使用@column标签?为什么这很有用?另外,在fieldgroup上使用beanfieldgroup有什么好处。另一件我很苦恼的事是,一旦bean验证有假的地方,我该如何使用sql容器来添加,更新和删除数据。 – Thinker 2013-04-24 16:12:27

+0

我刚刚复制了我的代码。 [@Column](http://docs.oracle.com/javaee/6/api/javax/persistence/Column.html)注释是JPA注释。 BeanFieldGroup会自动绑定到您的Bean并允许您使用Bean Validation Annotations,因此您没有在视图中添加Validator,并在模型上进行了所有验证配置(明确区分关注点)。对于CRUD操作,如果您使用的是JPA,则应该使用JPA容器,并且您应该(请尝试官方AGPL版本https://vaadin.com/blog/-/blogs/1066517)。 – Christian 2013-04-25 05:06:49

1

要完成上面的例子,使用BeanFieldGroup,因为它得到验证器,您可以使用AbstractField的setValidationVisible方法关闭初步验证,然后打开blurListener和按钮clickListeners。

AbstractTextField cName = binder.buildAndBind("Name","name", AbstractTextField.class); 
cName.setNullRepresentation(""); 
cName.setValidationVisible(false); 
cName.addBlurListener(new MyBlurListener(cName)); //<-- turn on setValidationVisible there 

myButton.addClickListener(event -> { 
    try { 
     cName.setValidationVisible(true); 
     binder.commit(); 
    } catch (CommitException e){ 
     Notification.show("Sending error"); 
    } 
});