[英]GWT Map Editor + Validator
我面临以下情况:
让B和C我正在编辑的bean,让B定义为Map的属性:
public class B {
@Valid
private C c;
@Valid
private Map<String, C> map = new HashMap<String, C>();
public Map<String, C> getMap() {
return map;
}
public void setMap(Map<String, C> lista) {
this.map = lista;
}
public B() {
}
public C getC() {
return c;
}
public void setC(C c) {
this.c = c;
}
}
public class C {
private Long id;
@NotEmpty
@Size(min=10)
private String foo;
@Min(value=100)
private Integer pages;
public C() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFoo() {
return foo;
}
public void setFoo(String foo) {
this.foo = foo;
}
public Integer getPages() {
return pages;
}
public void setPages(Integer pages) {
this.pages = pages;
}
}
让BEditor,CEditor和CMapEditor分别是我用来编辑这些bean和map属性的编辑器:
public class BEditor extends Composite implements Editor<B> {
CMapEditor mapEditor;
CEditor cEditor;
public BEditor() {
mapEditor = new CMapEditor();
cEditor = new CEditor();
VerticalLayoutContainer c = new VerticalLayoutContainer();
c.add(mapEditor, new VerticalLayoutData(-1, 0.5));
c.add(cEditor, new VerticalLayoutData(-1, 0.5));
initWidget(c);
}
}
public class CEditor extends Composite implements Editor<C>{
TextField fooEditor;
IntegerSpinnerField pagesEditor;
public CEditor() {
fooEditor = new TextField();
pagesEditor = new IntegerSpinnerField();
pagesEditor.setErrorSupport(new ToolTipErrorHandler(pagesEditor));
VerticalLayoutContainer c = new VerticalLayoutContainer();
c.add(fooEditor, new VerticalLayoutData(1, -1));
c.add(pagesEditor, new VerticalLayoutData(1, -1));
initWidget(c);
}
}
public class CMapEditor extends Composite implements ValueAwareEditor<Map<String, C>> {
Map<String, CEditor> ceditors = new HashMap<String, CEditor>();
private Map<String, C> value = new HashMap<String, C>();
private String[] locales = { "en", "es" };
public CMapEditor() {
TabPanel tabPanel = new TabPanel();
for (String locale : locales) {
CEditor cEditor = new CEditor();
ceditors.put(locale, cEditor);
tabPanel.add(cEditor, locale);
}
initWidget(tabPanel);
}
@Override
public void flush() {
for (Entry<String, C> entry : value.entrySet()) {
CEditor cEditor = ceditors.get(entry.getKey());
C c = entry.getValue();
c.setFoo(cEditor.fooEditor.getValue());
c.setPages(cEditor.pagesEditor.getValue());
}
}
@Override
public void setValue(Map<String, C> value) {
this.value = value;
for (Entry<String, C> entry : value.entrySet()) {
C c = entry.getValue();
CEditor cEditor = ceditors.get(entry.getKey());
cEditor.fooEditor.setValue(c.getFoo());
cEditor.pagesEditor.setValue(c.getPages());
}
}
@Override
public void setDelegate(EditorDelegate<Map<String, C>> delegate) {
}
@Override
public void onPropertyChange(String... paths) {
}
}
当我开始编辑时,编辑器已正确填充。 刷新和验证也可以正常工作(验证器返回我期望的所有冲突),但是当我在驱动程序中设置冲突时,这些冲突的消息不会显示在CMapEditor组件的ErrorHandlers中:
// Create the Driver
Driver driver = GWT.create(Driver.class);
public void edit(B p) {
BEditor editor = new BEditor();
// Initialize the driver with the top-level editor
driver.initialize(editor);
// Copy the data in the object into the UI
driver.edit(p);
// Put the UI on the screen.
Dialog dialogBox = new Dialog();
dialogBox.setWidget(editor);
dialogBox.setWidth("350px");
dialogBox.setHeight("100px");
dialogBox.getButton(PredefinedButton.OK).addSelectHandler(new SelectEvent.SelectHandler() {
@Override
public void onSelect(SelectEvent event) {
B edited = driver.flush();
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set violations = validator.validate(edited);
if (!violations.isEmpty() && driver.setConstraintViolations(violations));
List<EditorError> errors = driver.getErrors();
//...
}
});
dialogBox.show();
}
我缺少某种黑魔法吗? 还有另一种方法可以解决这种情况吗?
提前致谢
我不明白(还有更多事情我想念),或者您在这里错过了很大的难题-您的CMapEditor似乎没有监听错误,并且没有将其子路径暴露给驱动程序(例如,请参见ListEditor),因此您调用CEditors Editor
的事实并不意味着它们实际上是系统的一部分。 您正在手动连接CMapEditor中的“子”编辑器,这意味着您现在有责任在需要调用它们时对其进行调用。
ListEditor
扩展了CompositeEditor
,并添加了对在列表中工作的特定支持,并通过告知常规编辑器系统及其对应的路径,让子编辑器参与编辑。 您应该考虑扩展CompositeEditor,可能像CMapEditor implements CompositeEditor<Map<String, C>, C, CEditor>
,还是添加诸如interface MapEditor<K, V, E extends Editor<? super V>> extends CompositeEditor<Map<K, V>, V, E>
的中间可重用类型来interface MapEditor<K, V, E extends Editor<? super V>> extends CompositeEditor<Map<K, V>, V, E>
interface MapEditor<K, V, E extends Editor<? super V>> extends CompositeEditor<Map<K, V>, V, E>
,并实现了它以构建自己的CMapEditor类型。
如果没有连接新创建的CEditor对象,以便它们可以与委托或驱动程序对话(通常通过将其设置为Editor
或IsEditor
字段,也可以使用CompositeEditor.Chain
工具),则系统不会了解您的编辑者,无法调用他们。 这提供了另一个选项:使CMapEditor还实现HasEditorErrors <...>,以便获得整个地图上的所有错误,并将它们自己传递给CEditor。 显然,这将需要您做更多的工作,并要求您保持最新状态,但这是一个折衷方案-如果您将子编辑器告诉编辑器系统,它将为您完成,但是可以。如果不知道自己需要做,那就去做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.