Добрый день!
Возникла необходимость сделать как минимум два разных и независимых друг от друга подключаемых компонента, каждый из которых будет дополнять главное меню приложения разделом, в котором количество подпунктов будет определяться как во время запуска, так и в runtime (В частности есть сущность, в БД 5 экземпляров сущности = после первого открытия в разделе 5 подпунктов, открывается один и тот же экран, но с разными аргументами. Если пользователь добавляет экземпляр сущности, без перезапуска появляется 6й пункт меню). Все достаточно просто, если переопределять главный экран ExtMainScreen в основном приложении и использовать для этого, например, SideMenu, но идея не работает, если переопределять его в каждом подключаемом компоненте, особенно учитывая то, что компонент не знает какой вид меню используется в основном приложении. Может быть есть возможность подступиться со стороны MenuConfig или другого компонента при загрузке?
Добрый день,
Вы можете воспользоваться шаблоном проектирования “inversion of control”.
- Создаете маленький компонент. Все, что в нем будет - это интерфейс, в веб-модуле. Который должны реализовать поставщики дополнительных пунктов меню.
Например что-то в этом духе:
public interface MenuItemSupplier {
void addMenuItems(AppMenu mainMenu);
}
-
В других подключаемых компонентах - подключаете корневой маленький аддон и реализуете MenuItemSupplier в виде Spring-бина.
-
В конечном проекте нужно будет подключить все компоненты.
Затем через метод AppBeans.getAll() получить все реализации MenuItemSupplier и вызвать их, чтобы дополнительные пункты добавились.
Данная логика может быть реализована в расширенном экране, который создан прямо в проекте.
Добрый день. Благодарю за подробный ответ!
Изначально меня интересовала возможность сделать это именно без переопределения экрана, потому что это требует дополнительных действий в основном приложении после подключения компонента, тоесть решение не работает “Из коробки”. Но так как простого способа так сделать вероятно не существует, воспользуюсь способом, который вы привели.
Главный экран можно переопределить и в корневом маленьком аддоне, если вас это устроит.