2012-11-22 3 views
4

수정 된 연락처를 저장하지 못하도록 유효성 검사를 위해 ContactDocuments가 editor.getList().remove(index)으로 제거되었다는 것이 문제입니다. 예를 들어 requestContext.save()editor.getList().add()과 함께 새 ContactDocument를 추가하면 onConstraintViolation과 함께 실패하고 일부 필드에서는 @NotNull 위반으로 인해 즉시 제거됩니다.GWT : ListEditor가 목록에서 제거 된 엔티티의 유효성 검사를 잘못 시도 함

나는 간단한 관계가있다 : 연락처에는 많은 ContactDocuments가있다. 요청 공장 및 편집자 프레임 워크로 Contact를 편집하려고합니다. 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); 
     } 
    }); 
을 를 해결할 수 ?

답변

1

중 하나를 사용하여 실제 프록시의 작성을 지연 더블 (프록시 인터페이스를 구현하는 클래스를 만들 오히려 RF 프록시보다 그 클래스의 인스턴스를 생성하고 일 이후 플러시가짜 프록시를 대체하기 위해 실제 프록시를 만들면, 서버로 보내지 않을 프록시를 결코 만들지 않을 것입니다.

또는 단지 다른 사람의 일환으로 개체를 확인 가능하면, 결코 개별적합니다 (ContactDocument를 보관 재산에 @Valid를 사용하여, 단지 Contact 검증의 일환으로, 자신에 ContactDocument 유효성을 검사하지 않음) :이 는 validate 메서드를 무시하고 메서드를 사용하여 수행 할 수 있습니다. @GroupSequence 중 하나 또는 두 클래스 모두에서 이 아닌 특정 그룹을 사용하여 유효성을 검사합니다.

관련 문제 : Cannot remove proxy from RequestContext editing context

+0

감사합니다. 당신의 대답은 그 자리에 바로 있습니다. 그러나 나는 또 다른 문제가있다. 나는 나의 프록시 인터페이스를 구현 한 : 공용 클래스 ContactDocumentFakeProxy는 { @Override 공공 EntityProxyId stableId() { 는 null ContactDocumentProxy을 구현; } } 그러나 editor.getList(). add (새 ContactDocumentFakeProxy())를 사용하여 목록에 추가하면 IllegalArgumentException이 AbstractRequestContext.checkStreamsNotCrossed()에 의해 throw됩니다. 'AutoBeanUtils.getAutoBean (object)'는 내 구현에서 AutoBean을 생성 할 수 없습니다. – user882209

+0

스택 트레이 란 무엇입니까? 예외가 언제 던져 집니까? –

+0

http://pastebin.com/cTDv8AP9 – user882209