2013-04-23 73 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"); 
    } 
});