Создание и управление параметрами конфигурации в системе¶
Статья содержит информацию о создании, использовании и управлении параметрами конфигурации в системе Universe.
Параметры конфигурации загружаются в память при старте контекста Spring с использованием сервиса RuntimePropertiesService
из файла backend.properties.
Имя параметра формируется как Module.ID + ".name.props".
Класс ConfigurationProperty<T>¶
Параметр конфигурации - это экземпляр класса ConfigurationProperty.
В системе поддерживаются параметры следующих типов:
string - для строковых значений (String)
integer - для целых чисел (Long)
number - для чисел с плавающей точкой (Double)
bool - для булевых значений (Boolean)
clob - для больших текстовых данных (String)
custom - пользовательски тип, подробнее ниже
Экземпляр класса ConfigurationProperty
создается через ConfigurationPropertyBuilder
с помощью методов:
ConfigurationProperty.string()
ConfigurationProperty.integer()
ConfigurationProperty.number()
ConfigurationProperty.bool()
ConfigurationProperty.clob()
ConfigurationProperty.custom()
Для создания экземпляра ConfigurationProperty
необходимы следующие поля:
key - Ключ параметра, который идентифицирует настройку.
moduleId - Идентификатор модуля, к которому принадлежит настройка.
propertyType - Проставляется в момент создания билдера ConfigurationProperty.string().
Поля для группировки и сортировки:
groupKey;
groupId.
Управление параметрами:
required свойство должно быть обязательно задано на момент старта системы (default value или в backend.properties).
readOnly флаг - это параметр только для чтения и не может быть изменен в процессе работы.
publicProperty
defaultValue - значение по умолчанию.
Predicate<Optional<String>> validator - предикат для проверки значения свойства в момент установки.
Если тип параметра конфигурации - CUSTOM, то дополнительно необходимы поля:
deserializer (Свойство) - Функция для десериализации значения свойства. Обязательно для свойств с пользовательским типом (тип ConfigurationPropertyType.CUSTOM).
serializer - если свойство не только для чтения (readOnly равно false).
public static final ConfigurationProperty<DumpTargetFormat> SYSTEM_DUMP_TARGET_FORMAT = ConfigurationProperty.custom(DumpTargetFormat.class)
.key(SystemConfigurationConstants.PROPERTY_DUMP_TARGET_FORMAT)
.groupKey(SystemConfigurationConstants.PROPERTY_SYSTEM_GROUP)
.moduleId(SystemModule.MODULE_ID)
.deserializer(DumpTargetFormat::fromValue)
.serializer(DumpTargetFormat::name)
.defaultValue(DumpTargetFormat.PROTOSTUFF)
.readOnly(true)
.required(true)
.build();
Пример использования¶
Пример соответствует проекту HelloUniverse
, модуль SDKSpringModule
.
В статье упоминаются классы и файлы:
SDKSpringModuleConfigurationConstants
SDKSpringConfigurationProperty
SDKSpringModule
resources/sdk_spring_messages_ХХ.properties, где XX - локализация, ru/en/etc
Создание переменной¶
Все строковые константы находятся в SDKSpringModuleConfigurationConstants.class
.
Задайте константу в классе
SDKSpringConfigurationProperty
:
/**
* Пользовательская настройка
* Есть возможность добавить локализацию для этой настройки: добавить в resources/sdk_spring_messages_en
* .properties и resources/sdk_spring_messages_ru.properties
*/
public static final String PROPERTY_AUTH_LOGGING_ENABLE = SDKSpringModule.MODULE_ID + ".auth.log.enable";
public static final ConfigurationProperty<Boolean> AUTH_LOGGING_ENABLE = ConfigurationProperty.bool()
.key(SDKSpringModuleConfigurationConstants.PROPERTY_AUTH_LOGGING_ENABLE)
.groupKey(SDKSpringModuleConfigurationConstants.PROPERTY_SDK_SPRING_DEFAULT_GROUP)
// Для модуля возможно задать порядок отображения настроек на ui. По умолчанию Integer.MAX_VALUE
//.groupId(1001)
.moduleId(SDKSpringModule.MODULE_ID)
.defaultValue(false)
//.deserializer(t -> deserialize(t))
//.serializer(t -> serializer(t))
//.validator(t -> t.isPresent() && Integer.parseInt(t.get()) < 2 )
.readOnly(false)
.required(true)
.build();
private static final ConfigurationProperty<?>[] VALUES = {
AUTH_LOGGING_ENABLE
};
public static ConfigurationProperty<?>[] values() {
return VALUES;
}
Задайте локализацию в файлах
resources/sdk_spring_messages_ru.properties
иresources/sdk_spring_messages_en.properties
:
com.universe.mdm.sdk.spring.auth.log.enable = Вывод в лог результат авторизации
Подключите настройки в классе
SDKSpringConfigurationProperty
:
@Override
public ConfigurationProperty<?>[] getConfigurationProperties() {
return SDKSpringConfigurationProperty.values();
}
Подключение переменной¶
@ConfigurationRef(SDKSpringModuleConfigurationConstants.AUTH_LOGGING_ENABLE)
private ConfigurationValue<Boolean> authLoggingEnable;
Обновление перемененной¶
Для обновления значения переменной действия не требуются.
Если после обновления значения требуется реакция/интервенция, то необходимо имплементировать org.unidata.mdm.system.type.configuration.ConfigurationValueUpdatesListener.configurationValueUpdated(ConfigurationProperty<?>)
тем же бином, который содержит ссылку на переменную.
@Override
public void configurationValueUpdated(ConfigurationProperty<?> property) {
if (property == SDKSpringConfigurationProperty.AUTH_LOGGING_ENABLE) {
// Отправка электронного сообщения администратору
}
}
Переменная не обновляется, если у нее .readOnly(true).
Примечания¶
Если переменная описана как
ConfigurationProperty<Long>,
, и на нее есть ссылка в коде как наConfigurationValue<Boolean>
, то вы получите CCE (ClassCastException) в момент вставки значения.Из
org.unidata.mdm.system.service.RuntimePropertiesService
можно получать значения для любых переменных.Настройки могут быть заданы через @Value(), но это не рекомендуется.