1

我有一些带有 JSR 303 验证的 POJO,如下所示:

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

在应用程序中,我在 GWT 编辑器中使用 GXT FieldLabel 中的 GXT TextField 对其进行渲染。如果验证失败,FieldLabel 会自动显示红波和红旗:

验证

而这正是我所需要的。

但是对于像这样的更复杂的验证:

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

它是这样渲染的:

集合枚举

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

我以为GXT FieldLabel会自动在编辑器右侧添加红旗,以防验证失败。

  1. 我做错了什么吗?
  2. 是否有获得此反馈的最佳实践?
4

1 回答 1

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);
    }
  }
}
于 2013-10-21T16:05:22.067 回答