Я работаю над проектом, состоящим из четырех частей:
- Проект
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