Релиз 2.0 является важной вехой в развитии платформы Jmix. Он включает ряд важных новых функций и вносит существенные изменения в общий ландшафт Jmix. В этой статье мы расскажем об обновлениях и обсудим их последствия для прикладных проектов.
Полная информация об изменениях доступна на странице документации "Что нового".
Обновленный технологический стек
Очевидно, наиболее значимым изменением в Jmix 2.0 является новый технологический стек. Фреймворк теперь основан на последних версиях базовых технологий:
- Spring Boot 3.1, Spring Framework 6.0, Spring Security 6.1 в ядре Jmix core
- Vaadin 24.0 в подсистеме Flow UI
- EclipseLink 4.0 в качестве имплементации JPA в подсистеме доступа к данным
- Flowable 7.0 в качестве движка BPM
У новых версий базовых библиотек впереди достаточно долгий период поддержки, что гарантирует стабильное развитие платформы и приложений Jmix. Но есть и обратная сторона медали: теперь вам нужен как минимум JDK 17 для сборки и запуска приложений, а если вы развертываете свое приложение в WAR, необходимо обновить сервер Tomcat до версии 10.
Кроме того, в Jmix 2.0 не включена подсистема Classic UI, так как Vaadin 8, используемым в Classic UI, не совместим с новым Jakarta Servlet API и Spring 6. Поэтому чтобы перейти с Jmix 1.5 Classic UI на Jmix 2.0, вам необходимо заменить слой пользовательского интерфейса. Более подробно ситуация описана в предыдущей статье Расширенная поддержка классического UI
Для приложения Jmix 1.5 с Flow UI, новая Studio 2.0 обеспечивает гладкую миграцию.
Flow UI для дополнений
Мы реализовали Flow UI для дополнений BPM, Business Calendars, Email и Reports, так что теперь вы можете использовать их с Jmix 2.0.
Дополнение BPM теперь имеет полнофункциональный runtime BPMN моделер и UI для администрирования процессов:
Дизайнер отчетов стал яснее и может быть использован на экранах с низким разрешением:
Чтобы упростить UI для большинства случаев, дизайнер отчетов предполагает, что у полосы есть только один набор данных. Но если вы установите флажок Multiple Datasets, дизайнер переключится на более сложный вид:
Компонент GenericFilter
Компонент genericFilter
теперь полнофункционален и позволяет создавать конфигурации и пользовательские условия как во время разработки, так и во время выполнения приложения. Конфигурациями времени выполнения и пользовательскими условиями могут управлять конечные пользователи:
Компонент CodeEditor
Новый компонент codeEditor
, основанный на Ace editor, позволяет пользователям просматривать и редактировать код с подсветкой синтаксиса и другими расширенными функциями, такими как различные цветовые темы:
Предотвращение закрытия вкладки браузера
Частой проблемой в веб-приложениях является потеря введенных данных, если пользователь случайно закрывает вкладку браузера. Теперь браузер показывает стандартное подтверждение о выходе со страницы, если пользователь пытается закрыть вкладку браузера во время отображения экрана деталей сущности:
Такое поведение можно включить или выключить в любом экране с помощью его метода setPreventBrowserTabClosing()
.
Быстрое развертывание в облаке
Разработчикам часто приходится демонстрировать свое приложение пользователям, руководству или коллегам. Это легко сделать непосредственно на своем локальном компьютере, или если у вас уже есть конвейер CI/CD, разворачивающий ваше приложение в демонстрационной или тестовой среде. Но если вы индивидуальный разработчик и вам нужно продемонстрировать свое приложение людям на другом конце света, лучший вариант - развернуть его в облаке.
Теперь Studio позволяет это сделать за несколько простых шагов, которые не требуют каких-либо специальных знаний о деплойменте или облаках:
- Зарегистрируйте учетную запись на AWS
- Установите Docker на свой локальный компьютер
- Выполните несколько шагов мастера Quick Cloud Deployment в Studio.
В результате, в течение нескольких минут ваше приложение будет запущено на сервере AWS EC2, и доступно пользователям по всему миру.
За кулисами Studio генерирует docker-compose.yaml
для вашего приложения, создает экземпляр EC2 через AWS API, устанавливает на него Docker, создает образ с приложением на сервере и запускает docker-compose
с контейнерами вашего приложения и базы данных PostgreSQL. Данные базы данных и файлового хранилища отображаются на файловую систему сервера, гарантируя сохранение всех данных при изменении исходного кода, перестройке и повторном развертывании приложения.
Эта функция долгое время считалась незавершенной и была скрыта в Studio. Теперь, в версии 2.0, она наконец готова к использованию.
Усовершенствования в Studio UI/UX
Окно инструментов Jmix теперь отображает раздел со всеми бинами Spring, определенными в проекте:
Вы можете сгруппировать бины и другие элементы по пакетам, используя следующую опцию:
В разделе Beans отображаются только бины, определенные аннотацией @Component
или @Service
в классе бина. Бины, созданные в конфигурациях Java с использованием аннотаций @Bean
, здесь не показаны.
В диалоговом окне Inject теперь отображаются все бины, определенные во всем classpath, включая те, которые определены в конфигурациях Java с аннотациями @Bean
. В разделе Other Beans
предусмотрена группировка для упрощения поиска доступных бинов:
На нашем форуме была тема, где пользователь жаловался, что Studio генерирует код, который немедленно порождает предупреждения от IntelliJ типа "something can have 'final' modifier". Мы решили, что это справедливое замечание, и Studio должна соответствовать стандартному набору проверок IDE. В результате весь сгенерированный код теперь включает рекомендуемые модификаторы final
. Если вам это не нравится, откройте настройки плагина Jmix и отключите эту опцию на вкладке Project Settings.
Еще одно улучшение, влияющее на генерируемый код, заключается в том, что теперь для временных меток в чертах (traits) Audit of creation
, Audit of modification
и Soft Delete
используется тип OffsetDateTime
. Поэтому база данных будет хранить временные метки с указанием часового пояса.
BPM in Studio
Если ваш проект включает дополнение BPM, в окне инструментов Jmix теперь есть раздел BPM
. В разделе отображаются процессы BPMN, черновики процессов и таблицы DMN:
Вы можете копировать определения процессов между папками Process Drafts и Processes, используя кнопки действий в верхней части окна моделера. Это позволяет организовать работу следующим образом: вы работаете с определением процесса BPMN в папке Process Drafts и копируете его в Processes, как только определение готово. Все определения процессов, расположенные в папке Processes, будут развернуты при следующем запуске приложения. Если что-то пойдет не так с развертыванием, вы можете скопировать процесс обратно в черновики и удалить его из Processes, чтобы позволить приложению запуститься.
Аутентификация в универсальном REST
В версии 1.4 мы представили Jmix Authorization Server в качестве функциональности для предварительного просмотра. В версии 2.0 он стал основным способом аутентификации в универсальном REST. Мотивация для этого изменения двоякая. С одной стороны, старый модуль Jmix Security OAuth2 нельзя использовать в Jmix 2.0, поскольку он зависит от устаревшего Spring Security OAuth, который несовместим с Spring Boot 3. С другой стороны, мы должны были последовать рекомендациям и избавиться от устаревшего процесса OAuth Password grant.
Теперь, если вы используете универсальный REST, вам нужно выбрать "тип гранта", который определяет, как клиенты REST будут получать токены доступа. Jmix Authorization Server поддерживает два типа гранта: Client Credentials и Authorization Code. У них обоих есть преимущество перед Password grant в том, что они не позволяют клиентскому приложению знать пароль пользователя.
Наиболее похожим на старый Password grant и простым в реализации является Client Credentials grant. Его следует использовать для обмена данными между серверами, например, для интеграции со сторонней системой. В этом случае конфигурация Jmix Authorization Server включает в себя назначение клиенту списка существующих ролей приложения, например rest-minimal
, order-management
и т.п. Чтобы получить токен доступа, клиенту просто нужно передать свои client-id
и client-secret
в заголовке базовой аутентификации. Последующие вызовы API с этим токеном будут иметь контекст безопасности специального пользователя с именем, равным client-id
, и списком ролей, настроенных для этого клиента в свойствах приложения. Другими словами, клиент получает статический набор разрешений и никогда не работает как реальный пользователь приложения.
Authorization Code grant более сложный, но он позволяет клиенту работать от имени реального пользователя приложения. При таком типе гранта, когда клиент запрашивает аутентификацию, Jmix Authorization Server сам показывает страницу логина для пользователя, на которой он должен ввести свое имя и пароль. Затем сервер возвращает клиенту промежуточный код авторизации. Клиент обменивает код на токен доступа и использует токен для вызовов API. Таким образом, клиент работает как пользователь, ни в какой момент не получая пароля этого пользователя.
Заключение
С переходом на обновленный технологический стек и полноценный Flow UI, платформа Jmix завершает этап модернизации и переходит к устойчивому развитию. Наша команда продолжит работу над созданием новой функциональности и постоянным улучшением общего качества продукта.
Для следующего функционального релиза, который выйдет в октябре 2023 года, мы уже запланировали несколько важных обновлений. Они включают реализацию Flow UI для еще нескольких дополнений, добавление SuggestionField и SettingsFacet в Flow UI, а также улучшения в поддержке репозиториев данных. Наша подробная дорожная карта опубликована в виде проекта GitHub и регулярно обновляется.
Мы будем рады увидеть ваши отзывы на нашем форуме!
Спасибо всем, кто поделился своими идеями, предложениями и сообщениями об ошибках!