Search code examples
javagwtrequestfactory

Editor persist throws "A request is already in progress "


I'm trying to set up a basic editor in gwt. Everything works fine, the editor displays the data and saves but when I try to save again (i.e. press the save button 2 times) it throws me the error "A request is already in progress " in the second save, but the first time the editor saves the data correctly.

// 
//Methods that edit and save the editor, located in ComposerEditorContainer class 
// 
public void edit(RequestContext requestContext) { 
                editorDriver = GWT.create(Driver.class); 
                editorDriver.initialize(requestFactory, composerEditor); 
                editorDriver.edit(composer, requestContext); 
        } 

public void save() { 
                ComposerRequest composerRequest = (ComposerRequest) editorDriver 
                                .flush(); 
                ComposerProxy newProxy = composerRequest.edit(composer); 
                composerRequest.persist(newProxy).fire(); 
        } 

// 
//Events in a presenter that save and initialize the editor 
// 
                eventBus.addHandler(SaveButtonClickedEvent.TYPE, 
                                new SaveButtonClickedEventHandler() { 
                                        @Override 
                                        public void onSaveButtonClicked(SaveButtonClickedEvent event) { 
                                                ((ComposerEditorContainer) composerEditorContainer) 
                                                                .save(); 
                                        } 
                                }); 
//This method gets the ComposerProxy from the event and initializes the editor in ComposerEditorContainer (above)
// 
                eventBus.addHandler(BrowserItemClickedEvent.TYPE, 
                                new BrowserItemClickedEventHandler() { 
                                        @Override 
                                        public void onBrowserItemClicked( 
                                                        BrowserItemClickedEvent event) { 
                                                requestFactory = GWT.create(AppRequestFactory.class); 
                                                requestFactory.initialize(new SimpleEventBus()); 
                                                ComposerRequest request = requestFactory 
                                                                .getComposerRequest(); 
                                                Request<ComposerProxy> req = request.findComposer(event 
                                                                .getclickedItem().getValue()); 
                                                req.fire(new Receiver<ComposerProxy>() { 
                                                        public void onSuccess(ComposerProxy arg0) { 
                                                                ComposerEditorContainer editorContainer = new 
ComposerEditorContainer( 
                                                                                requestFactory, arg0); 
                                                                editorContainer.edit(requestFactory 
                                                                                .getComposerRequest()); 
                                                                view.clear(); 
                                                                view.addWidget(editorContainer); 
                                                                composerEditorContainer = editorContainer; 
                                                        } 
                                                }); 
                                        } 
                                }); 

//Error that appears when saving for the second time

Caused by: java.lang.IllegalStateException: A request is already in progress at com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext.checkLocked(AbstractRequestContext.java: 960) at com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext.editProxy(AbstractRequestContext.java: 510) at com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext.edit(AbstractRequestContext.java: 502) at com.google.test.client.editor.ComposerEditorContainer.save(ComposerEditorContainer.java: 58) at com.google.test.client.presenter.BrowserDetailPresenter $1.onSaveButtonClicked(BrowserDetailPresenter.java:48) at com.google.test.client.event.SaveButtonClickedEvent.dispatch(SaveButtonClickedEvent.java: 17)


Solution

  • Answered on the Google Group: https://groups.google.com/d/msg/google-web-toolkit/TfXd_SEJF30/ZTLkfXUQ2vUJ

    A RequestContext is a "builder"; you queue things into it and then fire(). Once fire()d, it's no longer usable; you have to create a new one and start over.