注入匿名内部类(GIN)

时间:2011-03-28 10:28:57

标签: gwt guice gin requestfactory

我有这样的事情:

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

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

它是抽象类ExtReceiver的匿名内部类。 ExtReceiver用于处理我想提供的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);
    }

}

我理解为什么这不起作用,因为我使用新的运算符。但我怎么能这样做呢。我希望拥有该匿名类,而不是将其放在自己的文件中。 我怎么能注入那个errorHandler?考虑一下staticInjections,但看起来这样也行不通(也许是因为我创建了一个匿名类创建的继承)

与普通Guice相反,我不知道一个injector.getInstance()调用。

有关信息:这是一个requestFactory调用

1 个答案:

答案 0 :(得分:1)

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

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

    private ErrorHandler errorHandler;

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

}

声明绑定:

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

为您的ErrorHandler类声明一个Ginjector,用模块注释它:

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

然后像这样使用它:

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

        }           
    });

我认为这应该有用。