Получение доступа к главному меню приложения без переопределения главного экрана

Добрый день!
Возникла необходимость сделать как минимум два разных и независимых друг от друга подключаемых компонента, каждый из которых будет дополнять главное меню приложения разделом, в котором количество подпунктов будет определяться как во время запуска, так и в runtime (В частности есть сущность, в БД 5 экземпляров сущности = после первого открытия в разделе 5 подпунктов, открывается один и тот же экран, но с разными аргументами. Если пользователь добавляет экземпляр сущности, без перезапуска появляется 6й пункт меню). Все достаточно просто, если переопределять главный экран ExtMainScreen в основном приложении и использовать для этого, например, SideMenu, но идея не работает, если переопределять его в каждом подключаемом компоненте, особенно учитывая то, что компонент не знает какой вид меню используется в основном приложении. Может быть есть возможность подступиться со стороны MenuConfig или другого компонента при загрузке?

Добрый день,
Вы можете воспользоваться шаблоном проектирования “inversion of control”.

  1. Создаете маленький компонент. Все, что в нем будет - это интерфейс, в веб-модуле. Который должны реализовать поставщики дополнительных пунктов меню.
    Например что-то в этом духе:
public interface MenuItemSupplier {
    void addMenuItems(AppMenu mainMenu);
}
  1. В других подключаемых компонентах - подключаете корневой маленький аддон и реализуете MenuItemSupplier в виде Spring-бина.

  2. В конечном проекте нужно будет подключить все компоненты.
    Затем через метод AppBeans.getAll() получить все реализации MenuItemSupplier и вызвать их, чтобы дополнительные пункты добавились.
    Данная логика может быть реализована в расширенном экране, который создан прямо в проекте.

2 симпатии

Добрый день. Благодарю за подробный ответ!
Изначально меня интересовала возможность сделать это именно без переопределения экрана, потому что это требует дополнительных действий в основном приложении после подключения компонента, тоесть решение не работает “Из коробки”. Но так как простого способа так сделать вероятно не существует, воспользуюсь способом, который вы привели.

Главный экран можно переопределить и в корневом маленьком аддоне, если вас это устроит.