Search code examples
gwtguicegwt-ginrequestfactory

Inject into anonymous inner class (GIN)


I have something like this:

request.findAllProjects().fire(new ExtReceiver<List<ProjectProxy>>() {

    @Override
    public void onSuccess(List<ProjectProxy> response) {
        view.setProjects(response);                     
    }
});

It is anonymous inner class of the abstract class ExtReceiver. The ExtReceiver is for handling the errors with an errorHandler which i want to provide.

public abstract class ExtReceiver<T> extends Receiver<T> {


    private ErrorHandler errorHandler;


    public ExtReceiver() {
    }

    @Inject
    public void setErrorHandler(ErrorHandler errorHandler)
    {
        this.errorHandler = errorHandler;
    }

    @Override
    public abstract void onSuccess(T response);

    @Override
    public void onFailure(ServerFailure error) {
        errorHandler.exception(error);
    }

    @Override
    public void onViolation(Set<Violation> errors) {
        ValidationUtils.processViolation(errors);
    }

}

I understand why this can't work, because i use the new Operator. But how could i do something like this. I want to have that anonymous class and not put it in an own file or something. How could I inject that errorHandler? Thought about staticInjections, but it looked like this does not work too (Maybe because of the inheritance i create with doing an anonymous class)

In the opposite to normal Guice i don't know an injector.getInstance() call.

For information: That is a requestFactory call


Solution

  • Why don't you put the errorHandler parameter into the constructor of your abstract class instead creating a separate setErrorHandler setter, something like this:

    public abstract class ExtReceiver<T> extends Receiver<T> {
    
        private ErrorHandler errorHandler;
    
        @Inject
        public ExtReceiver(ErrorHandler errorHandler) {
             this.errorHandler = errorHandler;
        }
    
    }
    

    Declare the bindings:

    public class MyClientModule extends AbstractGinModule {
      protected void configure() {
        bind(ErrorHandler.class).in(Singleton.class);
      }
    }
    

    Declare a Ginjector for your ErrorHandler class annotating it with the Module:

    @GinModules(MyClientModule.class)
    public interface MyErrorHandlerInjector extends Ginjector {
      ErrorHandler getErrorHandler();
    }
    

    and then use it like this:

    MyErrorHandlerGinjector injector = GWT.create(MyErrorHandlerGinjector.class);
    ErrorHandler errorHandler = injector.getErrorHandler();
    request.findAllProjects().fire(new ExtReceiver<List<ProjectProxy>>(errorHandler) {      
    
            @Override
            public void onSuccess(List<ProjectProxy> response) {
                view.setProjects(response);
    
            }           
        });
    

    I think this should work.