Я работаю над проектом, состоящим из четырех частей:
- Проект
Main
, который объединяет все. Это содержит точку входаpublic static void main(String... args)
. - Компонент
A
- Компонент
B
- Компонент
Common
стороннего участника, на который ссылаются какA
, так иB
.
Я использую Guice для сантехники между четырьмя частями, и это моя проблема:
В A
и B
основных модулях Guice я устанавливаю модуль, который расширяет тот, который определен в Common
. Во время выполнения эта установка не работает со следующей ошибкой:
Связывание с
common.SomeClass
уже было настроено наcommon.AbstractCommonModule.configure()
. [источник]
Причиной этого является то, что я вызываю common.AbstractCommonModule.configure()
дважды; один раз, установив экземпляр подкласса common.AbstractCommonPrivateModule
из Component A
com.a.MainModule.configure()
и второй раз из Component B
com.b.MainModule.configure()
.
Установка только одного экземпляра common.AbstractCommonPrivateModule
в Main
не является опцией, потому что AbstractCommonPrivateModule
реализует специальный метод связывания bindComplicatedStuff(ComplicatedStuff)
, для которого я знаю только аргумент внутри A
и B
, соответственно.
Я попытался обойти все это, обернув A
и B
соответствующие основные модули Guice в PrivateModule
s. Однако это не удалось с следующей ошибкой:
Невозможно создать привязку для% s. Он уже был настроен для одного или нескольких дочерних инжекторов или частных модулей% s% n Если бы это было в PrivateModule, вы забыли открыть привязку? [источник]
В моем случае A
и B
соответствующие основные модули Guice фактически ServletModule
- которые, по-видимому, я могу установить дважды от Main
.
Как обойти эти ошибки и установить модуль AbstractCommonPrivateModule
дважды?
Изменить: Я загрузил некоторый пример кода (с объяснением некоторых деталей) в GitHub