2013-07-29 73 views
1

當我進入我的表的編輯模式,我想要在該表的所有字段上進行數據驗證。Vaadin Bean驗證表

首先,有兩點要注意:

  • 我使用Vaadin 7,所以Bean驗證插件黯然將無法正常工作。
  • 我知道JSR-303的工作原理,因爲我嘗試向TextField添加一個BeanValidator而沒有問題。

現在,我有一個完美的工作表,我正在使用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... 
} 

人豆被添加到BeanItemContainer,其又被設定爲容器數據源與setContainerDataSource()

的BeanValidator加入到表像這樣:

table.addValidator(new BeanValidator(Person.class, "firstName")); 

當我運行應用程序,我有兩個問題:

  1. 當我運行該應用程序時,表格按預期顯示。但是,當我編輯字段並將其中一個firstName字段設置爲「abc」時 - 沒有顯示驗證錯誤並且該值被接受 我該如何讓BeanValidator在我的所有表格字段上工作?

  2. 當我使用table.setSelectable(真)或table.setMultiSelect(真),我得到這個錯誤:

    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 How am I supposed to get BeanValidator to work with Selectable/MultiSelect?

請指點

謝謝!

+0

這將是有用的看到:a)'Person.firstName'字段的聲明,b)該字段的問題值 –

+0

Person類現在被添加到我原來的問題。 此外,我找到了一個問題(例外)的原因,但它仍然無法正常工作。我相應地更新了我的原始問題。 – Roger

回答

4

您需要將驗證器添加到可編輯字段本身,而不是表格。 (表本身是一個字段=>驗證器從table.addValidator驗證表的值=>表的值是選擇的itemId(s)=> BeanValidator失敗)

您可以將驗證器添加到字段通過在表上使用自定義的TableFieldFactory。下面是此方案中一個非常簡單的一次性的例子 - 顯然,如果你需要有很多不同的豆子/表要做到這一點,這將是值得創建一個更通用/定製工廠

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; 
    } 
+0

當然。這聽起來很明顯。我會盡快給它一個結果,然後回來。謝謝查爾斯! – Roger

+0

它的工作原理!但是,只有當我用無效值預加載表格時(雖然會顯示一個紅色文字,表明出現了什麼問題)。 當我編輯表格並從有效值更改爲無效值時,它不會接受它 - 如預期的那樣,但另一方面驗證錯誤工具提示不會顯示。 接下來的問題是爲什麼沒有顯示紅色感嘆號,但這可能超出了這個問題的範圍。 – Roger

+0

現在收到警告文本。我必須使它成爲AbstractField並使用setImmediate(true)。不過,我必須在文本框中按回車鍵,並且出現工具提示。 – Roger