繁体   English   中英

GWT地图编辑器+验证器

[英]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对象,以便它们可以与委托或驱动程序对话(通常通过将其设置为EditorIsEditor字段,也可以使用CompositeEditor.Chain工具),则系统不会了解您的编辑者,无法调用他们。 这提供了另一个选项:使CMapEditor还实现HasEditorErrors <...>,以便获得整个地图上的所有错误,并将它们自己传递给CEditor。 显然,这将需要您做更多的工作,并要求您保持最新状态,但这是一个折衷方案-如果您将子编辑器告诉编辑器系统,它将为您完成,但是可以。如果不知道自己需要做,那就去做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM