GXT验证反馈

时间:2013-10-21 13:18:06

标签: java validation gwt gxt

我有一些POJO与JSR 303验证像这样:

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

在应用程序中,我使用包含在GXT FieldLabel中的GXT TextField在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;
  }
}

这就像这样:

SetEnum

问题在于,即使包含在GXT FieldLabel中,如果没有选中任何选项,我也没有反馈。因此,验证失败,用户没有反馈。

我认为如果验证失败,GXT FieldLabel会自动在编辑器右侧添加红色标记。

  1. 我做错了吗?
  2. 是否有获得此反馈的最佳做法?

1 个答案:

答案 0 :(得分:3)

我终于找到了自己的解决方案:我相信 FieldLabel处理反馈本身但这是错误的。

  1. 我的班级必须实施HasEditorErrors<Set<T>>,以便调用方法void showErrors(List<EditorError> errors)。在这种情况下,我可以做任何我想做的事:显示图标,下划线等等。

  2. GXT中有一个预定义的类,用于处理图标+验证消息:SideErrorHandler

  3. 因此,我修改了这样的类:

    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);
        }
      }
    }