0

我有这样的事情:

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 调用

4

1 回答 1

1

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

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,并使用 Module 对其进行注释:

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

        }           
    });

我认为这应该有效。

于 2011-03-28T11:54:33.447 回答