Iniettare in classe interna anonima (Gin)
-
12-11-2019 - |
Domanda
Ho qualcosa di simile:
request.findAllProjects().fire(new ExtReceiver<List<ProjectProxy>>() {
@Override
public void onSuccess(List<ProjectProxy> response) {
view.setProjects(response);
}
});
.
È la classe interiore anonima della classe astratta Extreceiver.L'extreceiver è per la gestione degli errori con un errore che voglio fornire.
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);
}
}
.
Capisco perché questo non può funzionare, perché uso il nuovo operatore.Ma come potrei fare qualcosa del genere.Voglio avere quella classe anonima e non metterlo in un proprio file o qualcosa del genere. Come potrei iniettare quell'errore?Pensiero sulle statiche delle statiche, ma sembrava che questo non funziona anche (forse a causa dell'eredità che creo con una classe anonima)
Nel contrario alla normale Guice non conosco un invito a iniettore.Geinstance ().
Per informazioni: questa è una chiamata di richiesta
Soluzione
Perché non inserisci il parametro ErrorHandler nel costruttore della classe astratta invece creando un setter Setter SetErrorHandler, qualcosa del genere:
public abstract class ExtReceiver<T> extends Receiver<T> {
private ErrorHandler errorHandler;
@Inject
public ExtReceiver(ErrorHandler errorHandler) {
this.errorHandler = errorHandler;
}
}
.
Dichiarare i Binding:
.
public class MyClientModule extends AbstractGinModule {
protected void configure() {
bind(ErrorHandler.class).in(Singleton.class);
}
}
Dichiarare un Ginjector per la tua classe Error Error ErrorNating IT con il modulo:
.
@GinModules(MyClientModule.class)
public interface MyErrorHandlerInjector extends Ginjector {
ErrorHandler getErrorHandler();
}
e quindi usalo come questo:
.
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);
}
});
Penso che questo dovrebbe funzionare.