Что нового
В данном разделе приведена информация о новой функциональности и возможных несовместимых изменениях в фреймворке Jmix и Jmix Studio версии 2.3. Примите их во внимание при обновлении с предыдущей версии фреймворка.
Для создания новых проектов в Jmix 2.3 или для апгрейда существующего проекта требуется Studio 2.3 или более поздней версии, поэтому в первую очередь обновите плагин Jmix Studio. Минимальная требуемая версия IntelliJ IDEA - 2023.3. |
Раздел Апгрейд проекта содержит информацию о том, как обновить проект с помощью Studio. Процедура автоматической миграции вносит следующие изменения в ваш проект:
-
Обновляет версию Jmix BOM, которая, в свою очередь, определяет версии всех зависимостей.
-
Обновляет версию Jmix Gradle plugin.
-
Обновляет версию Gradle wrapper до 8.7 в
gradle/wrapper/gradle-wrapper.properties
. -
Добавляет свойство
lumoImports
в файлfrontend/themes/<theme-name>/theme.json
. -
Заменяет
@Autowired
на@ViewComponent
для инжекцииMessageBundle
в экранах. -
Устанавливает свойство приложения
jmix.ui.component.filter-show-non-jpa-properties
в false. -
Заменяет использование класса
io.jmix.flowui.component.validation.group.UiCrossFieldChecks
наio.jmix.core.validation.group.UiCrossFieldChecks
. -
Если в проекте используется хранилище на Oracle, добавляет зависимость
org.eclipse.persistence.oracle
и обновляет драйвер JDBC.
См. полный список опасных изменений, которые могут затронуть ваш проект после обновления.
Новая и улучшенная функциональность
Дополнение Superset
Дополнение Superset предназначено для интеграции приложений Jmix с Apache Superset. Оно позволяет встраивать дэшборды, созданные в Apache Superset, в экраны приложений.
Для получения полной информации см. документацию по дополнению Superset.
Поддержка OpenSearch
Дополнение Search теперь кроме Elasticsearch поддерживает также и OpenSearch. Информация о том, как выбрать сервер, приведена в разделе установка дополнения.
Фрагменты
Фрагмент - это новый структурный элемент пользовательского интерфейса, который можно использовать в качестве компонента экранов или других фрагментов.
Фрагменты позволяют повторно использовать код и помогают разбить сложные экраны на более мелкие и управляемые части.
Для получения полной информации см. раздел Фрагменты.
Репозитории данных в экранах
Теперь вы можете легко делегировать загрузку и сохранение данных в экранах репозиториям Spring Data.
При создании экрана списка или деталей сущности, выберите флажок Use Data Repositories на первой странице мастера в секции Advanced и выберите существующий репозиторий данных из выпадающего списка. Мастер сгенерирует делегаты загрузки и сохранения, которые будут вызывать соответствующие методы репозитория.
Методы загрузки репозиториев, унаследованных от JmixDataRepository
, теперь поддерживают дополнительный аргумент типа JmixDataRepositoryContext
. Это позволяет передавать параметры фильтрации, пейджинга и сортировки, собранные в объект LoadContext
из UI-компонентов. В результате все функции компонентов genericFilter
, simplePagination
и dataGrid
будут полноценно работать с репозиториями данных.
Ленивые вкладки в TabSheet
Вкладка (tab) компонента tabSheet теперь может быть помечена как lazy
. Содержимое такой вкладки не загружается автоматически, что улучшает производительность для экранов с большим количеством вкладок и UI-компонентов на них.
Для получения более подробной информации см. раздел Lazy Tabs.
Компонент TwinColumn
Новый компонент twinColumn позволяет пользователям интуитивно выбирать элементы из списка или коллекции, перемещая их между двумя столбцами.
Указание исходного экрана при навигации
Для устранения проблемы #3157 API ViewNavigators
был изменен: теперь при навигации требуется указывать исходное представление. Старые методы навигации помечены как deprecated, и рекомендуется заменить их на новые, которые принимают исходный экран.
Если вызывающий класс не является экраном, и вы не можете передать this
в качестве источника, используйте UiComponentUtils.getCurrentView()
, например:
viewNavigators.view(UiComponentUtils.getCurrentView(), viewId).navigate();
В UI-тестах текущий экран можно получить с помощью UiTestUtils.getCurrentView()
, например:
View<?> parent = UiTestUtils.getCurrentView();
viewNavigators.view(parent, UserListView.class).navigate();
Навигация к процессным формам BPM
При навигации к процессной форме, Jmix теперь использует параметр запроса URL taskId
или processDefinitionId
. Это позволяет безопасно перезагружать веб-страницу и сохранять глубокую ссылку на форму.
AuthenticationPrincipalResolver
Новый механизм определения объекта текущего пользователя делегирует выполнение цепочке реализаций AuthenticationPrincipalResolver
, которые пытаются вернуть правильный объект пользователя. Стандартная реализация в дополнении Authorization Server исправляет проблему, которая мешала использованию атрибутов пользователя в запросах REST API.
Проект приложения при необходимости может предоставить собственные реализации AuthenticationPrincipalResolver
.
Resource Owner Password Credentials Grant
Дополнение Authorization Server теперь поддерживает грант Resource Owner Password Credentials. Его можно использовать в доверенных, устаревших или строго контролируемых средах для простой аутентификации REST-клиентов в качестве зарегистрированных пользователей приложения Jmix.
Для получения полной информации см. документацию по дополнению Authorization Server.
Публикация сервисов в универсальном REST
Добавлен новый экспериментальный способ публикации методов сервисов в качестве эндпойнтов универсального REST.
Вместо создания файла rest-services.xml
, как описано в документации по дополнению Универсальный REST, вы можете использовать аннотации io.jmix.rest.annotation.RestService
и io.jmix.rest.annotation.RestMethod
на классах сервисов и их бизнес-методах соответственно.
Для получения более подробной информации см. #1323.
Агрегация файлов Liquibase changelog
В контекстном меню хранилища данных Jmix Studio доступно новое действие: Aggregate Liquibase Changelogs. Оно позволяет объединить несколько последних файлов changelog в один, исключая дублирование действий в наборах изменений (changesets).
Эта функция может быть использована разработчиками перед каждым коммитом изменений в общий репозиторий кода. Она помогает поддерживать аккуратную коллекцию файлов changelog и сокращает время запуска приложения за счет меньшего числа наборов изменений.
Генерация обработчиков исключений UI
Теперь обработчики исключений UI можно создавать используя команду New → Advanced → UI Exception Handler панели инструментов Jmix.
Опасные изменения
Конфигурация безопасности UI
Конфигурация безопасности UI была переработана, при этом класс io.jmix.securityflowui.FlowuiSecurityConfiguration
объявлен устаревшим. Если ваш проект расширяет этот класс, вам необходимо обновить вашу конфигурацию и расширять новый класс io.jmix.securityflowui.security.FlowuiVaadinWebSecurity
.
Для получения более подробной информации см. #3182.
Явный импорт Lumo
Тема приложения должна явно объявлять импорты из темы Lumo, например:
{
"parent": "jmix-lumo",
"lumoImports": [
"typography",
"color",
"spacing",
"badge",
"utility"
]
}
Процесс миграции Studio автоматически выполнит это изменение.
Для получения более подробной информации см. #3347.
@ViewComponent для инжекции MessageBundle
Для инжекции MessageBundle
в экран должна использоваться аннотация @ViewComponent
. Процесс миграции Studio автоматически обновит все существующие экраны.
Для получения более подробной информации см. #2812.
Ленивые мягко удаленные ссылки один-к-одному
Исправлена ленивая загрузка мягко удаленных ссылок один-к-одному. Теперь она ведет себя так же, как жадная загрузка с фетч-планами:
-
Мягко удаленные сущности загружаются через ссылки один-к-одному с владеющей стороны.
-
Мягко удаленные сущности НЕ загружаются через ссылки один-к-одному со стороны
mappedBy
.
Ранее поведение ленивой загрузки было противоположным.
Для получения более подробной информации см. #2466.
Стиль по умолчанию в VectorLayer
При использовании дополнения Maps, стиль по умолчанию теперь удаляется методом VectorLayer.removeAllStyles()
. Чтобы восстановить стиль по умолчанию, добавьте его явно перед другими. Например:
@ViewComponent("map.vector")
private VectorLayer vector;
@Subscribe
private void onInit(final InitEvent event) {
vector.removeAllStyles();
vector.addStyles(
Style.createDefaultStyle(),
new Style());
}
Для получения более подробной информации см. #3140.