Injetar na classe interna anônima (GIN)
-
12-11-2019 - |
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
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.