2015-09-17 4 views
2

Я пытаюсь ввести разные версии одного и того же родового типа, до сих пор не повезло. Связки, которые я делаю в AbstractModule реализации являются:Ввод аннотированных родовых классов с помощью Guice

bind(new TypeLiteral<ConcurrentHashMap<String, Integer>>() { 
}).annotatedWith(Names.named("name0")).toProvider(
    ConcurrentHashMap::new).in(Singleton.class); 
    bind(new TypeLiteral<ConcurrentHashMap<String, Long>>() { 
}).annotatedWith(Names.named("name1")).toProvider(
    ConcurrentHashMap::new).in(Singleton.class); 
    bind(new TypeLiteral<ConcurrentHashMap<String, Boolean>>() { 
}).annotatedWith(Names.named("name2")).toProvider(
    ConcurrentHashMap::new).in(Singleton.class); 
    bind(new TypeLiteral<ConcurrentHashMap<String, Short>>() { 
}).annotatedWith(Names.named("name3")).toProvider(
    ConcurrentHashMap::new).in(Singleton.class); 

Я попытался инъекционного их просто с помощью:

@Inject @Named("name0") ConcurrentHashMap<String, Integer>; 

и так далее. Однако я получаю следующую ошибку:

1) Unable to create binding for java.util.concurrent.ConcurrentHashMap<java.lang.String, java.lang.Integer> annotated with @com.google.inject.name.Named(value=name0). It was already configured on one or more child injectors or private modules

Что я делаю неправильно? Благодаря!

+0

Это выглядит хорошо для меня , вы можете попытаться [редактировать], чтобы опубликовать более полную [mcve], пожалуйста? – durron597

ответ

2

Код в порядке, и сообщение об ошибке довольно ясно: проверьте свои дочерние инжекторы и ваши личные модули для любых других привязок к @Named("name0") ConcurrentHashMap<String, Integer>. Guice очень осторожен, чтобы не допускать привязки для одного и того же ключа в одном и том же инжекторе, даже если привязки недоступны непосредственно из родительского инжектора из-за детских инжекторов или частных модулей.

Вы можете также рассмотреть вопрос о переходе toProvider синтаксиса

bind(new TypeLiteral<ConcurrentHashMap<String, Integer>>() { 
}).annotatedWith(Names.named("name0")).toProvider(
ConcurrentHashMap::new).in(Singleton.class); 

к более простому использованию to:

bind(new TypeLiteral<ConcurrentHashMap<String, Integer>>() {}) 
    .annotatedWith(Names.named("name0")) 
    .to(ConcurrentHashMap.class) 
    .in(Singleton.class); 

... отчасти потому, что это более характерно для использования Guice, а отчасти потому, что он может позволяют Guice быть более разрешительными с дублирующимися привязками. (Guice, возможно, нелегко обнаружить дубликаты с помощью перевода Java 8 от ConcurrentHashMap::new до Provider<ConcurrentHashMap>.) Диагностика дублирования привязки, вероятно, является лучшей идеей.

+0

Ваше предложение на самом деле не компилируется, я получаю: (аргумент несоответствие; java.lang.Class не может преобразуется в java.lang.Class >) – Shirile

+0

У меня нет дочерних инжекторов: только одна реализация AbstractModule, с привязками, которые в исходном вопросе – Shirile

2

Я обнаружил, что проблема связана с самим инжектором. Когда я использую «Регулярный» инжектор Guice (по телефону Guice.createInjector(new MyModule()) все работает нормально. Однако я использовал инжектор регулятора netflix (вызвав LifecycleInjector.builder().withModules(new MyModule()).build().createInjector()), который, кажется, вызывает проблему.

Смежные вопросы