Что нового

В данном разделе приведена информация о новой функциональности и возможных несовместимых изменениях в фреймворке Jmix и Jmix Studio версии 1.4. Примите их во внимание при обновлении с предыдущей версии фреймворка.

Для создания новых проектов в Jmix 1.4 или для апгрейда существующего проекта требуется Studio 1.4 или более поздней версии, поэтому в первую очередь обновите плагин Jmix Studio.

Минимальная требуемая версия IntelliJ IDEA - 2022.1.

Перейдите к разделу Апгрейд проекта, чтобы узнать, как обновить проект с помощью Studio. Процедура автоматической миграции вносит следующие изменения в ваш проект:

  • Обновляет версию Jmix BOM, которая, в свою очередь, определяет версии всех зависимостей.

  • Обновляет версию Jmix Gradle plugin.

  • Обновляет версию Gradle wrapper до 7.5.1 в gradle/wrapper/gradle-wrapper.properties.

Новая и улучшенная функциональность

Flow UI

Новый модуль Flow UI, основанный на Vaadin 23, теперь доступен как надежная основа для создания новых проектов. Его API достаточно стабилен и в дальнейшем будет развиваться по стандартным правилам: обратно-совместимые патчи, возможные незначительные несовместимости в минорных функциональных релизах.

Для использования Flow UI в новом проекте, создайте проект с помощью шаблона Full-Stack Application with Incubating FlowUI.

Мы рассматриваем Flow UI как модуль, находящийся "в развитии" (incubating), так как пока он несопоставим по функциональности с классическим UI.

Для использования в проектах с Flow UI доступны некоторые дополнения: Data Tools, Audit, а также все дополнения без UI, такие как REST и файловые хранилища.

Studio включает в себя новый визуальный дизайнер для экранов Flow UI. У него есть существенное отличие от дизайнера классического UI: панель Palette отсутствует. Вместо нее используется действие Add Component, которое доступно из верхней панели действий, через контекстное меню панели Component Hierarchy и меню Generate (Alt+Ins / Cmd+N).

Если предпросмотр отображается неверно, попробуйте нажать кнопку Restart в верхней панели дизайнера. Кнопка Console открывает и закрывает консоль с выводом сборки фронтенда, что может помочь в диагностике проблем.

flowui designer 1

Окно инструментов Jmix

Секция Configuration окна инструменов Jmix теперь отображает все классы, аннотированные @Configuration и ее производными (например @SpringBootApplication), классы @ConfigurationProperties, а также конфигурационные файлы REST queries и services:

config section

Бины Spring, имеющие методы с сущностью в аргументах или результате, отображаются в секции Beans данной сущности:

data model beans
Элементы дерева могут быть сгруппированы по пакетам: см. Show Options Menu (gear) → Group by Packages.

Инжекция в конструктор

Studio поддерживает инжекцию зависимостей в конструкторы бинов Spring. Для этого установите в диалоге Choose Objects to Inject флажок Use constructor injection:

constructor injection 1

Тогда Studio создаст финальное поле и аргумент конструктора:

@Component
public class CustomerService {

    private final DataManager dataManager;

    public CustomerService(DataManager dataManager) {
        this.dataManager = dataManager;
    }

Ваш выбор будет запомнен. Вы сможете изменить его позже в диалоге Choose Objects to Inject и в окне настроек плагина Jmix.

Мастер создания ролей уровня строк

Теперь вы можете создавать роли уровня строк и их политики используя мастер, запускаемый командой NewRow-level Role в панели инструментов Jmix. См. раздел Мастер ролей уровня строк.

Собственные шаблоны проектов

Studio 1.4 поддерживает возможность использования собственного (кастомного) артефакта с шаблонами. С помощью такого артефакта можно предоставлять разработчику собственные шаблоны проектов и экранов UI/FlowUI.

Подробная информация приведена в разделе Собственные шаблоны проектов.

Точки расширения конфигурации Security

Конфигурации security, предоставляемые фреймворком и дополнениями, теперь можно расширять, вместо того чтобы полностью заменять их.

Чтобы донастроить какую-либо конфигурацию, нужно определить бин Spring, расширяющий класс AbstractHttpConfigurer и аннотировать его соответствующим @Qualifier.

Пример донастройки StandardSecurityConfiguration:

@Component
@Qualifier(StandardSecurityConfiguration.SECURITY_CONFIGURER_QUALIFIER)
public class MySecurityConfigurer extends AbstractHttpConfigurer<MySecurityConfigurer, HttpSecurity> {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        MyFilter myFilter = new MyFilter();
        http.addFilterBefore(myFilter, UsernamePasswordAuthenticationFilter.class);
    }
}

Пример расширения конфигурации security дополнения OIDC:

@Component
@Qualifier(OidcAutoConfiguration.OAuth2LoginSecurityConfiguration.SECURITY_CONFIGURER_QUALIFIER)
public class MyOidcSecurityConfigurer extends AbstractHttpConfigurer<MyOidcSecurityConfigurer, HttpSecurity> {
    @Override
    public void init(HttpSecurity http) throws Exception {
	// any method that adds another configurer must be invoked in the init method
        http.headers(headers -> {
            headers.frameOptions().deny();
        });
    }
}

Собственная валидация паролей

Чтобы реализовать собственную валидацию паролей в приложении, достаточно создать бин (или несколько бинов), реализующий интерфейс PasswordValidator. Например:

@Component
public class MyPasswordValidator implements PasswordValidator<User> {

    @Override
    public void validate(PasswordValidationContext<User> context) throws PasswordValidationException {
         if (context.getPassword().length() < 3)
            throw new PasswordValidationException("Password is too short, must be >= 3 characters");
    }
}

Все валидаторы будут автоматически использованы в диалоге действия ChangePassword.

Для добавления кастомной валидации в экран редактирования сущности User, используйте бин-помощник PasswordValidation:

@Autowired
private PasswordValidation passwordValidation;

@Subscribe
protected void onBeforeCommit(BeforeCommitChangesEvent event) {
  if (entityStates.isNew(getEditedEntity())) {
      // ...
      List<String> validationErrors = passwordValidation.validate(getEditedEntity(), passwordField.getValue());
      if (!validationErrors.isEmpty()) {
          notifications.create(Notifications.NotificationType.WARNING)
                  .withCaption(String.join("\n", validationErrors))
                  .show();
          event.preventCommit();
      }
      getEditedEntity().setPassword(passwordEncoder.encode(passwordField.getValue()));
  }
}

Пессимистичная блокировка в DataManager

Fluent-интерфейс загрузки сущностей DataManager теперь принимает значения перечисления javax.persistence.LockModeType в методе lockMode(). При работе с JPA-сущностями, это вызывает соответствующую пессимистичную блокировку на уровне базы данных с помощью оператора select …​ for update.

Например:

Customer customer = dataManager.load(Customer.class)
        .id(customerId)
        .lockMode(LockModeType.PESSIMISTIC_WRITE)
        .one();

Предварительные функции

Сервер авторизации

Новое дополнение Jmix Authorization Server позволяет выпускать access и refresh токены и защищать ресурсы внешнего API (REST API, кастомные контроллеры) с помощью этих токенов. Сервер авторизации поддерживает authorization code grant для веб и мобильных клиентов и client credentials grant для межсерверного взаимодействия.

Дополнение построено на основе Spring Authorization Server. Jmix Authorization Server является заменой модуля Jmix Security OAuth2, который зависит от устаревшего проекта Spring Security OAuth.

Более подробная информация о дополнении приведена в README проекта.

Опасные изменения

Миграция на SecurityFilterChain

Конфигурации security фреймворка и дополнений мигрированы с устаревшего WebSecurityConfigurerAdapter на рекомендуемый SecurityFilterChain.

Если у вас есть конфигурации security, расширяющие WebSecurityConfigurerAdapter, перепишите их следуя рекомендациям данной статьи из блога Spring.

Список изменений