Java GWT:ListEditor错误地尝试验证从列表中删除的实体

Java GWT:ListEditor错误地尝试验证从列表中删除的实体,java,gwt,bean-validation,requestfactory,gwt-editors,Java,Gwt,Bean Validation,Requestfactory,Gwt Editors,问题是,使用editor.getList().remove(index)删除的ContactDocuments仍然会被传递以进行验证,因此无法保存编辑过的Contact。例如,requestContext.save()如果我使用editor.getList().add()添加新的ContactDocument,则onConstraintViolation将失败,因为某些字段上存在@NotNull冲突 我有一个简单的关系:联系人有很多联系人文档。我正在尝试编辑与请求工厂和编辑器框架的联系。Cont

问题是,使用
editor.getList().remove(index)
删除的ContactDocuments仍然会被传递以进行验证,因此无法保存编辑过的Contact。例如,
requestContext.save()
如果我使用
editor.getList().add()
添加新的ContactDocument,则onConstraintViolation将失败,因为某些字段上存在@NotNull冲突

我有一个简单的关系:联系人有很多联系人文档。我正在尝试编辑与请求工厂和编辑器框架的联系。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);
}
}
公共类ContactDocumentListEditor扩展复合实现IsEditor,HasRequestContext{
私有请求上下文请求上下文;
接口ViewUiBinder扩展UiBinder{}
私有最终静态ViewUiBinder=GWT.create(ViewUiBinder.class);
private final ListEditor editor=ListEditor.of(new DocumentEditorSource());
@尤菲尔德
垂直板容器;
@尤菲尔德
按钮addContactDocumentButton;
@UiHandler(“addContactDocumentButton”)
作废添加联系人文档按钮单击(单击事件){
addNewContactDocument();
}
公共联系人DocumentListEditor(){
initWidget(uiBinder.createAndBindUi(this));
}
私有类DocumentEditorSource扩展了EditorSource{
@凌驾
公共联系人文档编辑器创建(最终int索引){
final ContactDocumentEditor documentEditor=新建ContactDocumentEditor();
documentEditor.addClickHandler(新的ClickHandler(){
@凌驾
公共作废一次点击(点击事件){
移除文档编辑器(索引);
}
});
container.insert(文档编辑器,索引);
返回文档编辑器;
}
@凌驾
public void dispose(ContactDocumentEditor子编辑器){
移除容器(子编辑器);
}
@凌驾
public void setIndex(ContactDocumentEditor子编辑器,int index){
container.insert(子编辑器,索引);
}
}
@凌驾
public ListEditor asEditor(){
返回编辑器;
}
@凌驾
公共无效setRequestContext(RequestContext ctx){
requestContext=ctx;
}
私有void addNewContactDocument(){
ContactDocumentProxy newDocument=requestContext.create(ContactDocumentProxy.class);
editor.getList().add(newDocument);
}
私有void removeDocumentEditor(int索引){
editor.getList().remove(索引);
}
}
我的演示者要驱动它:

    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);
        }
    });
final ContactRequestContext ContactRequestContext=contactRequestContextProvider.get();
contactRequestContext.save(联系人);
编辑(contact,contactRequestContext);
driver.flush().fire(新接收器()){
@凌驾
成功时公开作废(作废响应){
//成功
}
@凌驾
public void onConstraintViolation(Set通过使用双精度(创建一个实现代理接口的类,创建该类的实例而不是RF代理,并在刷新时或刷新后创建真实代理以替换虚假代理;这样,您就永远不会创建一个不会发送到服务器的代理)

或者,如果可能,仅将您的对象作为其他对象的一部分进行验证,而不单独进行验证(不要单独验证
ContactDocument
,仅作为验证
联系人的一部分,在包含
ContactDocument
的属性上使用
@Valid
):这可以通过使用
servicelayercorator
覆盖
验证
方法来实现,可能与一个或两个类上的
@GroupSequence
结合使用
servicelayercorator
使用
默认值以外的特定组进行验证


相关问题:

谢谢,Thomas!你的答案当场就对了。但是我还有另一个问题。我已经实现了我的代理接口:公共类ContactDocumentFakeProxy实现了ContactDocumentProxy{@Override public EntityProxyId stableId(){return null;}}但是,当我用AbstractRequestContext.checkStreamsNotCrossed()将它添加到列表中时,
editor.getList().add(new ContactDocumentFakeProxy())
IllegalArgumentException被AbstractRequestContext.checkStreamsNotCrossed()抛出。它似乎是
AutoBeanUtils.getAutoBean(对象)
无法从我的实现创建自动bean。stacktrace是什么?何时引发异常?我将尝试
ServiceLayerCorator
方法。感谢您的帮助!