Gwt 注入匿名内部类(GIN)

Gwt 注入匿名内部类(GIN),gwt,guice,gwt-gin,requestfactory,Gwt,Guice,Gwt Gin,Requestfactory,我有这样的想法: request.findAllProjects().fire(new ExtReceiver<List<ProjectProxy>>() { @Override public void onSuccess(List<ProjectProxy> response) { view.setProjects(response); } }); public abstr

我有这样的想法:

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

    @Override
    public void onSuccess(List<ProjectProxy> response) {
        view.setProjects(response);                     
    }
});
public abstract class ExtReceiver<T> extends Receiver<T> {

    private ErrorHandler errorHandler;

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

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

        }           
    });
request.findAllProjects(){
@凌驾
成功时公共无效(列表响应){
视图。设置项目(响应);
}
});
它是抽象类ExterReceiver的匿名内部类。ExterReceiver用于使用我想要提供的errorHandler处理错误

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

}
public抽象类ExtReceiver扩展接收方{
私人ErrorHandler;
公共外部接收者(){
}
@注入
public void setErrorHandler(ErrorHandler ErrorHandler)
{
this.errorHandler=errorHandler;
}
@凌驾
公开摘要无效(T响应);
@凌驾
public void onFailure(服务器故障错误){
errorHandler.exception(错误);
}
@凌驾
公共无效onViolation(设置错误){
ValidationUtils.processViolation(错误);
}
}
我明白为什么这样不行,因为我使用了新的操作符。但是我怎么能做这样的事呢。我想拥有那个匿名类,而不是把它放在自己的文件或其他东西中。 我怎样才能注入那个错误处理器?考虑过静态注入,但这似乎也不起作用(可能是因为我通过执行匿名类创建的继承)

与普通GUI相反,我不知道injector.getInstance()调用


仅供参考:这是一个requestFactory调用,为什么不将errorHandler参数放入抽象类的构造函数中,而创建一个单独的setErrorHandler setter,如下所示:

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

    @Override
    public void onSuccess(List<ProjectProxy> response) {
        view.setProjects(response);                     
    }
});
public abstract class ExtReceiver<T> extends Receiver<T> {

    private ErrorHandler errorHandler;

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

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

        }           
    });
为ErrorHandler类声明一个Ginject,并用模块注释它:

public class MyClientModule extends AbstractGinModule {
  protected void configure() {
    bind(ErrorHandler.class).in(Singleton.class);
  }
}
@GinModules(MyClientModule.class)
public interface MyErrorHandlerInjector extends Ginjector {
  ErrorHandler getErrorHandler();
}
然后像这样使用它:

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

    @Override
    public void onSuccess(List<ProjectProxy> response) {
        view.setProjects(response);                     
    }
});
public abstract class ExtReceiver<T> extends Receiver<T> {

    private ErrorHandler errorHandler;

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

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

        }           
    });
MyErrorHandlerGinjector=GWT.create(MyErrorHandlerGinjector.class);
ErrorHandler=injector.getErrorHandler();
request.findAllProjects().fire(新的外部接收器(errorHandler){
@凌驾
成功时公共无效(列表响应){
视图。设置项目(响应);
}           
});

我认为这应该行得通。

我最终扩展了现有的Ginject。我只有一个getApp()-调用,它是根。现在我有了第二个getErrorHandler()调用。但我认为这是唯一的解决办法。与建议的解决方案不同的是,在ExterReceiver的静态构造中而不是在调用类中创建注入器。因此,我不必像您那样手动注入errorHandler。