Внедрить в анонимный внутренний класс (GIN) - PullRequest
0 голосов
/ 28 марта 2011

У меня есть что-то вроде этого:

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? Думал о staticInjection, но, похоже, это тоже не работает (может быть, из-за наследования, которое я создаю, делая анонимный класс)

В отличие от обычного Guice, я не знаю вызова injector.getInstance ().

Для справки: это запрос фабричного звонка

1 Ответ

1 голос
/ 28 марта 2011

Почему бы вам не поместить параметр 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);
  }
}

Объявите Ginjector для вашего класса ErrorHandler, аннотируя его с помощью модуля:

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

        }           
    });

Я думаю, что это должно работать.

...