Pergunta

Eu tenho algo assim:

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

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

É uma classe interna anônima da classe abstrata ExtReceiver.O ExtReceiver serve para lidar com os erros com um errorHandler que desejo fornecer.

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);
    }

}

Entendo por que isso não funciona, porque uso o novo Operador.Mas como eu poderia fazer algo assim.Quero ter aquela classe anônima e não colocá-la em um arquivo próprio ou algo assim.Como eu poderia injetar esse errorHandler?Pensei em staticInjections, mas parecia que isso também não funciona (talvez por causa da herança que criei ao fazer uma classe anônima)

Ao contrário do Guice normal, não conheço uma chamada injector.getInstance().

Para informação:Essa é uma chamada requestFactory

Foi útil?

Solução

Por que você não coloca o parâmetro errorHandler no construtor da sua classe abstrata, em vez de criar um setter setErrorHandler separado, algo assim:

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

    private ErrorHandler errorHandler;

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

}

Declare as ligações:

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

Declare um Ginjector para sua classe ErrorHandler anotando-a com o Módulo:

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

e então use assim:

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);

        }           
    });

Eu acho que isso deve funcionar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top