Логическое значение false не сохраняется в Настройках приложения

Доброго дня!
При попытке установить и сохранить значение false для свойства типа Boolean кастомной настройки приложения, значение сохраняется как NULL. Изменение происходит через стандартный экран AppSettingsEntityScreen. Значения свойств в базе данных соответствуют отображаемым на экране.

Воспроизведение:

  1. Открыть экран Administration → Application settings;
  2. В выпадающем списке выбрать кастомную настройку приложения;
  3. Изменить значение свойства на False;
  4. Сохранить изменения, нажав на кнопку Save;
  5. Закрыть экран Application settings;
  6. Повторно открыть экран Administration → Application settings и выбрать кастомную настройку приложения;

ОР: На экране отображены свойства кастомной настройки приложения, где значения измененного свойства False;

ФР: На экране отображены свойства кастомной настройки приложения, где значения измененного свойства null.

PS: Если на экране Application settings с помощью выпадающего списка установить значение свойства True, а затем установить значение NULL, значение свойства будет отображено как False.

Воспроизведение PS
  1. Открыть экран Administration → Application settings;
  2. В выпадающем списке выбрать кастомную настройку приложения;
  3. Изменить значение свойства на True;
  4. Изменить значение свойства на NULL;

ОР: Отображаемое значение свойства NULL;

ФР: Отображаемое значение свойства False.

Такое поведение актуально, когда для свойства не указано значение по умолчанию.

Обстановка

Jmix version: 1.7.1
Jmix Studio Plugin Version: 2.6.2-252
IntelliJ version: IntelliJ IDEA 2025.2 (Community Edition)

Прикладываю тестовый проект для воспроизведения
applsettings.zip (74.3 КБ)

Сергей, здравствуйте!

Спасибо, что подробно описали проблему, завел issue.

Как очень быстрый workaround можно переопределить экран AppSettingsEntityScreen в проекте, скопировать туда код из оригинального экрана и добавть метод setDefaultValuesForMissingProperties из бина AppSettings:

public class ExtAppSettingsEntityScreen extends Screen {
//...
    protected InstanceContainer initInstanceContainerWithDbEntity() {
        InstanceContainer container = dataComponents.createInstanceContainer(currentMetaClass.getJavaClass());
        entityToEdit = dataManager.load(currentMetaClass.getJavaClass())
                .query(String.format(SELECT_APP_SETTINGS_ENTITY_QUERY, currentMetaClass.getName()))
                .fetchPlan(fetchPlans.builder(currentMetaClass.getJavaClass()).addFetchPlan(FetchPlan.LOCAL).build())
                .hint(PersistenceHints.SOFT_DELETION, false)
                .optional()
                .orElse(null);

        setDefaultValuesForMissingProperties(entityToEdit);

        if (entityToEdit == null) {
            entityToEdit = dataContext.create(currentMetaClass.getJavaClass());
        } else {
            entityToEdit = dataContext.merge(entityToEdit);
        }

        container.setItem(entityToEdit);
        return container;
    }

    protected void setDefaultValuesForMissingProperties(Object settingsEntity) {
        List<String> propertyNames = appSettingsTools.getPropertyNames(currentMetaClass.getJavaClass());
        Class<? extends AppSettingsEntity> clazz = (Class<? extends AppSettingsEntity>) settingsEntity.getClass();
        for (String propertyName : propertyNames) {
            Object propertyValue = EntityValues.getValue(settingsEntity, propertyName);
            if (Objects.isNull(propertyValue)) {
                EntityValues.setValue(settingsEntity, propertyName, appSettingsTools.getDefaultPropertyValue(clazz, propertyName));
            }
        }
    }
//...
}

Пример исправлений в проекте:
applsettings_fixed.zip (77.9 КБ)

P.S.

Воспроизведение PS

  1. Открыть экран Administration → Application settings;
  2. В выпадающем списке выбрать кастомную настройку приложения;
  3. Изменить значение свойства на True;
  4. Изменить значение свойства на NULL;

ОР: Отображаемое значение свойства NULL;

ФР: Отображаемое значение свойства False.

Такое поведение в приведенном WA исправлять не стал потому, что все равно сущность, полученная через бин AppSettings будет иметь значение False вместо NULL. В тикете так же описал эту несогласованность поведения.

С уважением,
Дмитрий

1 симпатия