我有一些POJO与JSR 303验证像这样:
@NotNull
@Size(max = 80)
@Column(name = "trs_name")
private String name;
在应用程序中,我使用包含在GXT FieldLabel中的GXT TextField在GWT编辑器中进行渲染。如果验证失败,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会自动在编辑器右侧添加红色标记。
答案 0 :(得分:3)
我终于找到了自己的解决方案:我相信 FieldLabel处理反馈本身但这是错误的。
我的班级必须实施HasEditorErrors<Set<T>>
,以便调用方法void showErrors(List<EditorError> errors)
。在这种情况下,我可以做任何我想做的事:显示图标,下划线等等。
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);
}
}
}