Hello,

i have the same problem and the same interrogation (intentional or
not ?)
If you look on the RF doc, all code examples use Request<T> to fire(),
but all the real samples (DynaTableRF, Expenses) I've studied use
RequestContext to fire() instance request.

And is there any other differences between the two "fires" ?
Any RF developers around ? :)

Anthony.

On 16 nov, 16:27, Dain Kaplan <[email protected]> wrote:
> I dug around a bit and discovered why the onFailure() handler was not being 
> called. The DynaTableRf sample that ships with GWT 2.1 uses the new Editor 
> framework. In the PersonEditorWorkflow.java class it initializes the editor 
> and keeps a copy of the RequestContext as follows:
>
>   PersonRequest context =requestFactory.personRequest();
>   context.persist().using(person);
>
> When the user clicks the "Save" button, the onSave() click handler gets 
> called, which basically does:
>
>   context.fire(new Receiver<Void>() {
>     @Override
>     public void onSuccess(Void response) {
>       dialog.hide();
>     }
>
>     @Override
>     public void onViolation(Set<Violation> errors) {
>       dialog.setText("Errors detected on the server");
>       editorDriver.setViolations(errors);
>     }
>   });
>
> For dealing with successes and violations, that works fine. The problem 
> happens when you want to deal with exceptions thrown on the server. The 
> RequestContext and Request objects seem to have their own Receiver() 
> instances, but only the Receiver instance for the Request (and NOT the 
> RequestContext) gets parsed for server-side exceptions (see 
> com.google.gwt.requestfactory.client.impl.AbstractRequest.handleResponseText()
>  for the error parsing code, and AbstractRequestContext.doFire() for 
> RequestContext code that ignores any errors). To briefly show what's going 
> on, below is a snippet from the TransportReceiver that gets created in the 
> AbstractRequestContext.doFire() method for handling the request:
>
>   public void onTransportSuccess(String payload) {
>     try {
>       // TODO: chained methods
>       assert invocations.size() == 1;
>       invocations.get(0).handleResponseText(payload);
>
>       if (receiver != null) {
>         if (errors.isEmpty()) {
>           receiver.onSuccess(null);
>           // After success, shut down the context
>           editedProxies.clear();
>           invocations.clear();
>           returnedProxies.clear();
>         } else {
>           receiver.onViolation(errors);
>         }
>       }
>     } finally {
>       postRequestCleanup();
>     }
>   }
>
> What winds up happening is that if the payload contains errors, they get 
> processed in the handleResponseText() method call, but only if the request 
> instance has a Receiver set. The code below that does not handle errors at 
> all, so even on error the onSuccess() method of your receiver gets called.
>
> Is such behavior intentional?
>
> The workaround is to set the Request's Receiver instance and call 
> context.fire() instead, but still leaves the DynaTableRf sample a bit 
> misleading.
>
> DK
>
> On Nov 16, 2010, at 4:43 PM, DK wrote:
>
> > I've encountered the same problem. Intuition says that throwing an
> > error should trigger the onFailure() method, not the onSuccess()
> > method with a SEVERE logging the exception. Is this a known bug?
>
> > On Nov 6, 5:03 am, Henrique F M <[email protected]> wrote:
> >> Hi there,
>
> >> I didn't find the solution to this anywhere, so I'm creating this new
> >> discussion.
>
> >> I want to be able to send errors from myRequestFactoryto the client.
> >> Let me give an example: let's say my app is a simple Person CRUD. My
> >> Person class has a String name attribute and I don't want to have more
> >> than two Persons with the same name. So i was thinking something like
> >> this:
>
> >> ----------RequestFactoryServer Implementation --------
> >> public static Person createNewPerson(String name){
> >>         ....
> >>         if( isThereAnotherPersonWithThisName(name) ){
>
> >>                 //do something HERE
>
> >>         }else{
> >>                 pm.makePersistent(person);
> >>         }
> >>         ...
>
> >> }
>
> >> ------ Client ---------------
> >> (....).fire(
> >>         new Receiver<Person>() {
> >>                 @Override
> >>                 public void onSuccess(Person person) {
> >>                         Window.alert("OK!");
> >>                         //do stuff
> >>                 }
> >>                 @Override
> >>                 public void onFailure(ServerFailure error) {
> >>                         Window.alert("Fail!");
> >>                         Window.alert(error.getMessage());
> >>                         //do stuff
> >>                 }
> >>         });
>
> >> --------------------
> >> I don't know what I have to do on HERE to make my Receiver go to
> >> onFailure. I've tried to throw Exceptions, RequestException, but it
> >> only make my server log the error and the response never arrives to
> >> the client.
> >> Am I missing something here? What would you suggest?
>
> >> Thanks
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "Google Web Toolkit" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to 
> > [email protected].
> > For more options, visit this group 
> > athttp://groups.google.com/group/google-web-toolkit?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to