2013-10-21 122 views
1

我有一些POJO與JSR 303的驗證這樣一個:GXT驗證反饋

@NotNull 
@Size(max = 80) 
@Column(name = "trs_name") 
private String name; 

在應用程序中,我有一個GXT文本字段包裹在GXT FieldLabel聯合,一個GWT編輯器中呈現它。如果驗證失敗,則FieldLabel聯合自動顯示一個紅色波和紅旗:

Validation

而這正是我需要的。

但是對於更復雜的驗證像這樣的:

@Size(min = 1) 
private Set<EnumRole> roles; 

我創建了一個自定義的Editor<Set<Enum>>

public class EnumSetEditor<T extends Enum<T>> extends Composite implements LeafValueEditor<Set<T>> { 


    private Map<T, CheckBox> map; 

    public EnumSetEditor(Class<T> clazz) { 
    FlowPanel panel = new FlowPanel(); 

    this.map = new HashMap<T, CheckBox>(); 
    for(T t : clazz.getEnumConstants()) { 
     CheckBox cb = new CheckBox(); 
     cb.setBoxLabel(I18nEnum.i18nEnum(t)); //translates the enum 
     panel.add(cb); 
     map.put(t, cb); 
    } 
    this.initWidget(panel); 
    } 

    @Override 
    public void setValue(Set<T> value) { 
    for(Map.Entry<T, CheckBox> entry : map.entrySet()) { 
     entry.getValue().setValue(value.contains(entry.getKey())); 
    } 
    } 

    @Override 
    public Set<T> getValue() { 
    Set<T> result = new HashSet<T>(); 
    for(Map.Entry<T, CheckBox> entry : map.entrySet()) { 
     if(entry.getValue().getValue()) { 
     result.add(entry.getKey()); 
     } 
    } 
    return result; 
    } 
} 

據rendred這樣的:

SetEnum

的問題在於,甚至包裹在GXT FieldLabel中,如果沒有選項被選中,我沒有任何反饋。因此,驗證失敗並且用戶沒有反饋。

我認爲GXT FieldLabel聯合將自動驗證失敗的情況下添加紅旗在編輯器的右側。

  1. 難道我做錯了什麼?
  2. 是否有獲得此反饋的最佳做法?

回答

3

我終於找到了解決辦法自己:我認爲, 的FieldLabel聯合處理的反饋本身 但這是錯誤的。

  1. 我的類必須實現HasEditorErrors<Set<T>>使方法void showErrors(List<EditorError> errors)被調用。我可以做我想做的事情在這種情況下:顯示一個圖標,強調的東西等

  2. 有在GXT預定類處理圖標+驗證消息:SideErrorHandler

因此,我修改了類是這樣的:

public class EnumSetEditor<T extends Enum<T>> extends Composite implements LeafValueEditor<Set<T>>, HasEditorErrors<Set<T>> { 

    //Added errorHandler attribute 
    private SideErrorHandler errorHandler; 

    public EnumSetEditor(Class<T> clazz) { 

    ... 
    //Initialize the ErrorHandler 
    this.errorHandler = new SideErrorHandler(this); 
    } 

    /* 
    * Implemented showErrors(List<EditorError> errors) 
    * I only delegate the errors to the ErrorHandler. 
    */ 

    @Override 
    public void showErrors(List<EditorError> errors) { 
    if(errors.isEmpty()) { 
     errorHandler.clearInvalid(); 
    } else { 
     errorHandler.markInvalid(errors); 
    } 
    } 
} 
+1

完全正確 - 標籤不管理錯誤,但該領域本身獲得誤差。相信我這一點,你不想生活在世界(提示:泛型地獄)標籤需要知道如何建立領域... –