Guice область действия и AssistedInject

У меня есть код, который использует AssistedInject для создания фабрик моих классов. Теперь я хочу создать несколько объектов, каждый из которых будет добавлен к другому элементу коллекции (можно сказать, обратное Multibinding).

Мой подход заключается в использовании пользовательского Scope, который содержит Iterator для предоставления Предметов, но я делаю что-то не так:

IterationScope.java:

public class IterationScope implements Scope {

  private Iterator<?> iterator;

  public IterationScope() {
  }

  /**
   * provide scoped Items
   * @param key - the key for the requested item
   * @param unscoped - the unscoped provider
   * @param <T> - the type of the requested object
   * @return - the requested provider
   */
  @SuppressWarnings("unchecked")
  @Override
  public <T> Provider<T> scope(Key<T> key, Provider<T> unscoped) {
    return Providers.<T>of((T)iterator.next());
  }

  public void enterScope(Iterator<?> iterator) {
    this.iterator = iterator;
  }

}

IterationScoped.java:

@Target({ FIELD, PARAMETER })
@Retention(RUNTIME)
@ScopeAnnotation @BindingAnnotation
public @interface IterationScoped {
}

В модуле:

IterationScope itScope = new IterationScope();
bindScope(IterationScoped.class, itScope);
bind(IterationScope.class).toInstance(itScope);
bind(ImplementationDataType.class).annotatedWith(IterationScoped.class).toProvider(Providers.of(null)).in(itScope);
/* do AssistedInject stuff */

Я пытаюсь получить значение следующим образом:

@Inject @IterationScoped ImplementationDataTypedataType

И установите область видимости так:

@Inject private IterationScope iterationScope; 

[...]
iterationScope.enterScope(someCollection.iterator);
for (ImplementationDataType message: someCollection){   
generatorChain.addNextFileGenerator(generatorFactory.create(param1,false));
}

У меня проблема в том, что уже при создании фабрик я получаю исключение NullPointerException в IteratorScope.scope, потому что итератор не установлен.

java.lang.NullPointerException
    at com.conti.xcit.utilities.guice.IterationScope.scope(IterationScope.java:45)
    at com.google.inject.internal.Scoping.scope(Scoping.java:240)
    at com.google.inject.internal.BindingProcessor$1.visit(BindingProcessor.java:104)
    at com.google.inject.internal.BindingProcessor$1.visit(BindingProcessor.java:68)
    at com.google.inject.internal.ProviderInstanceBindingImpl.acceptTargetVisitor(ProviderInstanceBindingImpl.java:62)
    at com.google.inject.internal.BindingProcessor.visit(BindingProcessor.java:68)
    at com.google.inject.internal.BindingProcessor.visit(BindingProcessor.java:42)
    at com.google.inject.internal.BindingImpl.acceptVisitor(BindingImpl.java:93)
    at com.google.inject.internal.AbstractProcessor.process(AbstractProcessor.java:55)
    at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:177)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103)
    at com.google.inject.internal.InjectorImpl.createChildInjector(InjectorImpl.java:217)
    at com.google.inject.internal.InjectorImpl.createChildInjector(InjectorImpl.java:224)
    at [... where I inject the Factory ... ]

Мое ожидание состояло бы в том, что фабрика пытается найти поставщика области действия, когда я фактически запрашиваю объект, а не при создании фабрики. Есть ли способ обойти это? У меня есть отвратительная идея, заключающаяся в том, чтобы привлечь провайдера с увеличенным счетчиком для выбора правильного элемента коллекции, но я бы хотел более чистый подход.

0 ответов

Другие вопросы по тегам