0

我有这个 ListEditor 负责编辑客户的许可证。在我的CustomerEditor中,thieLicensesEditor绑定到类型为 的路径许可证List<License>>

客户 (1)--> (许多) 许可证 (java.util.List)

现在,验证规则规定每个客户至少需要一个许可证。约束违规工作完美。但是如何为 ListEditor 实现 HasEditorErrors ...我想提供自己的错误标记。

我为 HasEditorErrors < T > 的泛型参数 T 注入什么类型

public interface HasEditorErrors<T> extends Editor<T>

ListEditor 的签名如下...

public class LicensesEditor extends Composite implements IsEditor<ListEditor<License, LicenseInListEditor>>

我试图实现HasEditorErrors<List<License>>在运行时给出错误:

[调试] [klawtapp] - 下降到许可证 [错误] [klawtapp] - 在代理类型 java.util.List 中找不到路径编辑器的 getter

如果我实施HasEditorErrors<LicensesEditor>

[错误] [klawtapp] 在代理类型 com.klawt.screen.ui.customers.LicensesEditor 中找不到路径编辑器的 getter

在 HasEditorErrors 中保留问号作为实现的接口会产生编译时错误:

LicensesEditor 类型不能扩展或实现 HasEditorErrors。超类型不能指定任何通配符 LicensesEditor.java

有人吗?

更新,下面的完整代码:

public class LicensesEditor extends Composite implements IsEditor<ListEditor<License, LicenseInListEditor>> {

    @UiField
    Image validationErrorIcon;

    interface LicensesEditorUiBinder extends UiBinder<Widget, LicensesEditor> {
    }

    private static LicensesEditorUiBinder uiBinder = GWT.create(LicensesEditorUiBinder.class);

    @UiField
    VerticalPanel container;

    ListEditor<License, LicenseInListEditor> editor;

    public LicensesEditor() {
        initWidget(uiBinder.createAndBindUi(this));
        editor = ListEditor.of(new LicenseInListEditorSource());
        clearErrors();
    }

    @Override
    public ListEditor<License, LicenseInListEditor> asEditor() {
        return editor;
    }

    public void addLicense(License emailAddress) {
        editor.getList().add(emailAddress);
        if (emailAddress.getAdministrator()) {
            setPrimary(editor.getList().size() - 1);
        }
    }

    public void remove(int index) {
        editor.getList().remove(index);
    }

    public void update(int index, License emailAddress) {
        editor.getList().remove(index);
        editor.getList().add(index, emailAddress);
    }

    /**
     * make the phonenumber at the index the primary phonenumber and the other
     * phone numbers not primary.
     * 
     * @param index
     */
    public void setPrimary(int index) {
        int loop = 0;

        for (License emailAddress : Collections.unmodifiableList(editor.getList())) {
            emailAddress.setAdministrator(index == loop);
            update(loop, emailAddress);
            loop++;
        }
    }

    private class LicenseInListEditorSource extends EditorSource<LicenseInListEditor> {

        @Override
        public LicenseInListEditor create(final int index) {
            LicenseInListEditor editor = new LicenseInListEditor();
            editor.addDeleteHandler(new ListEditorDeleteEventHandler() {
                @Override
                public void onEditorEvent(ListEditorDeleteEvent event) {
                    remove(index);
                }
            });
            editor.addUpdateHandler(new EditorUpdateEventHandler() {
                @Override
                public void onEditorUpdate(EditorUpdateEvent event) {
                    License emailAddress = (License) event.getUpdated();
                    update(index, emailAddress);
                    if (emailAddress.getAdministrator()) {
                        setPrimary(index);
                    }
                }
            });
            container.insert(editor, index);
            updateOddEven();
            return editor;
        }

        @Override
        public void dispose(LicenseInListEditor subEditor) {
            container.remove(subEditor);
            updateOddEven();
        }

        @Override
        public void setIndex(LicenseInListEditor editor, int index) {
            container.insert(editor, index);
            updateOddEven();
        }

        public void updateOddEven() {
            for (int widgetIndex = 0; widgetIndex < container.getWidgetCount(); widgetIndex++) {
                container.getWidget(widgetIndex).setStyleName(KlawtResources.INSTANCE.form().listEditorEven(),
                        (widgetIndex % 2 == 0));
                container.getWidget(widgetIndex).setStyleName(KlawtResources.INSTANCE.form().listEditorOdd(),
                        (widgetIndex % 2 == 1));
            }
        }

    }

    // @Override
    // public void showErrors(List<EditorError> errors) {
    // StringBuilder sb = new StringBuilder();
    // int errorCount = 0;
    // for (EditorError editorError : errors) {
    // if (errorCount > 0) {
    // sb.append("\n");
    // }
    // errorCount++;
    // sb.append(editorError.getMessage());
    // }
    // if (errorCount == 0) {
    // clearErrors();
    // } else {
    // container.setStyleName(KlawtResources.INSTANCE.form().formError(), true);
    // validationErrorIcon.setVisible(true);
    // validationErrorIcon.setTitle(sb.toString());
    // }
    // }

    private void clearErrors() {
        container.setStyleName(KlawtResources.INSTANCE.form().formError(), false);
        validationErrorIcon.setVisible(false);
        validationErrorIcon.setTitle("");
    }

}
4

1 回答 1

3

T不是问题,混合和匹配Editor,并且IsEditor当与(我怀疑 - 没有发布超过类型 decls 很难说)一些内部LicensesEditor(即ListEditor成员的访问修饰符,我认为你称之为editor)结合时。

接口用于表示“IsEditor<E>我自己不是编辑器,但我可以提供一个”,其实现的非私有成员Editor将被忽略,但框架仍会下降到E. 因为(我怀疑)你的LicensesEditor内部实际上有一个非私人编辑成员,

那么这会给你带来什么影响呢?几个对我来说似乎有意义的选择:

  • 停止使用IsEditor,以便您可以实施HasEditorErrors. 相反,make LicensesEditor extends Composite implements Editor<List<Licenses>>, HasEditorErrors<List<Licenses>>(虽然技术上第一个Editor被第二个覆盖,但我发现它有助于可读性)。现在您仍然需要一个 ListEditor 成员(几乎可以肯定您目前已经拥有),但是用注释@Path("")表示它应该编辑整个编辑器获得的相同值。

  • 使用IsEditor,但使其在两者上都通用HasEditorErrors-ListEditor创建一个 ListEditor 子类,该子类也实现HasEditorErrors并具有错误支持。这允许您仍然Composite在包装类中进行扩展。把这个转过来,你就...

  • 扩展ListEditor,并实现IsWidget而不是扩展 Composite。这实现了与第一个选项相同的效果(您可以通过摆脱 来LicensesEditor实现),而不用使事情变得有意义。现在,不再调用 ,而是保留对小部件的引用,并将其返回给.HasEditorErrorsIsEditor@PathComposite.initWidgetIsWidget.asWidget()

  • 最后,什么都不做。来自IsEditorJavadocs:

    一个类型同时实现 Editor 和 IsEditor 是合法的。在这种情况下,从 {@link #asEditor()} 返回的编辑器将是 IsEditor 实例的共同编辑器。

    这意味着它LicensesEditor应该是一个有效的Editor - any non-private Editor member should either be changed to private or tagged with@Ignore`。

于 2012-07-23T01:18:20.737 回答