【问题标题】:GWT: ListEditor incorrectly tries to validate entities removed form the listGWT:ListEditor 错误地尝试验证从列表中删除的实体
【发布时间】:2012-11-10 19:33:36
【问题描述】:

问题是使用editor.getList().remove(index) 删除的ContactDocuments 仍然通过验证,因此无法保存已编辑的联系人。例如,requestContext.save() 将因 onConstraintViolation 而失败,如果我使用 editor.getList().add() 添加新的 ContactDocument 然后由于某些字段上的 @NotNull 违规而立即将其删除。

我有一个简单的关系:联系人有很多 ContactDocuments。我正在尝试使用请求工厂和编辑器框架编辑联系人。 ContactDocuments 使用 JSR-303 进行注释以进行基本验证。

我的 ContactDocuments 集合的 ListEditor:

public class ContactDocumentListEditor extends Composite implements IsEditor<ListEditor<ContactDocumentProxy, ContactDocumentEditor>>, HasRequestContext<List<ContactDocumentProxy>> {
private RequestContext requestContext;

interface ViewUiBinder extends UiBinder<Widget, ContactDocumentListEditor> {}
private final static ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);

private final ListEditor<ContactDocumentProxy, ContactDocumentEditor> editor = ListEditor.of(new DocumentEditorSource());

@UiField
VerticalPanel container;
@UiField
Button addContactDocumentButton;


@UiHandler("addContactDocumentButton")
void addContactDocumentButtonClick(ClickEvent event) {
    addNewContactDocument();
}


public ContactDocumentListEditor() {
    initWidget(uiBinder.createAndBindUi(this));
}

private class DocumentEditorSource extends EditorSource<ContactDocumentEditor> {
    @Override
    public ContactDocumentEditor create(final int index) {
        final ContactDocumentEditor documentEditor = new ContactDocumentEditor();
        documentEditor.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                removeDocumentEditor(index);
            }
        });
        container.insert(documentEditor, index);
        return documentEditor;
    }

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

    @Override
    public void setIndex(ContactDocumentEditor subEditor, int index) {
        container.insert(subEditor, index);
    }
}

@Override
public ListEditor<ContactDocumentProxy, ContactDocumentEditor> asEditor() {
    return editor;
}

@Override
public void setRequestContext(RequestContext ctx) {
    requestContext = ctx;
}

private void addNewContactDocument() {
    ContactDocumentProxy newDocument = requestContext.create(ContactDocumentProxy.class);
    editor.getList().add(newDocument);
}

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

我的演示者来驱动它:

    final ContactRequestContext contactRequestContext =  contactRequestContextProvider.get();
    contactRequestContext.save(contact);
    driver.edit(contact, contactRequestContext);
    driver.flush().fire(new Receiver<Void>() {
        @Override
        public void onSuccess(Void response) {
            // success 
        }

        @Override
        public void onConstraintViolation(Set<ConstraintViolation<?>> violations) {
            for (ConstraintViolation violation : violations) {
                logger.info("Contact constraint violation: " + violation.getPropertyPath() + " = " + violation.getMessage());
            }
            driver.setConstraintViolations(violations);
        }
    });

我该如何解决?

【问题讨论】:

    标签: java gwt bean-validation requestfactory gwt-editors


    【解决方案1】:

    通过使用 double 来推迟 real 代理的创建(创建一个实现代理接口的类,创建该类的实例而不是一个 RF 代理,并在 flush 上或之后创建真正的代理来替换 fake 的代理;这样您将永远不会创建不会发送到服务器)。

    或者,如果可能,仅将您的对象作为其他对象的一部分进行验证,而不是单独验证(不要单独验证 ContactDocument,仅作为验证 Contact 的一部分,在包含 @ 的属性上使用 @Valid 987654325@s):这可以使用覆盖validate 方法的ServiceLayerDecorator 来完成,可能与一个或两个类上的@GroupSequence 以及使用Default 以外的特定组验证的ServiceLayerDecorator 结合使用。

    相关问题:Cannot remove proxy from RequestContext editing context

    【讨论】:

    • 谢谢,托马斯!你的答案是当场的。但是我还有另一个问题。我已经实现了我的代理接口: public class ContactDocumentFakeProxy implements ContactDocumentProxy { @Override public EntityProxyId> stableId() { return null;但是当我用editor.getList().add(new ContactDocumentFakeProxy())将它添加到列表时,AbstractRequestContext.checkStreamsNotCrossed() 会抛出 IllegalArgumentException。看来AutoBeanUtils.getAutoBean(object) 无法从我的实现中创建 AutoBean。
    • 堆栈跟踪是什么?什么时候抛出异常?
    • 我会尝试ServiceLayerDecorator 方法。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-04-19
    • 2019-12-05
    • 2019-05-12
    • 1970-01-01
    • 2016-10-31
    • 2019-09-13
    • 2014-05-30
    • 2019-09-05
    相关资源
    最近更新 更多