Автоматическая загрузка при запуске После интеграции этого компонента данные словарей будут автоматически загружены вместе с запуском Spring-приложения. Это позволит загрузить данные словарей из базы данных в кэш, что повысит производительность запросов к кэшу.
Синхронизация кэша
Интегрирование кэширующего компонента agile-cache позволяет менять тип кэширования spring.cache.type
, такие как Redis, EhCache, Memory и так далее. Для использования кэша обратитесь к документации кэширующего компонента https://gitee.com/agile-framework/agile-cache.
Комплексное преобразование
Предоставленный набор инструментов cloud.agileframework.dictionary.util.DictionaryUtil
обеспечивает множество способов комплексного преобразования словарей, таких как конвертирование между кодами и значениями словарей, перевод на основе информации о родительских словарях, полное преобразование значений/кодов словарей, анализ аннотаций словарей, работа с множественными данными словарей, использование пользовательского разделителя словарей, установка дефолтных значений и многое другое.* Аннотация словаря
Аннотация cloud.agileframework.dictionary.annotation.Dictionary
используется для добавления метаданных к свойствам POJO-классов. Она может использоваться через метод DictionaryUtil.cover
или встроена в компоненты уровня базы данных для незаметной работы с данными.* Пользовательский разделитель словарей
Разделитель словарей — это специальный символ, используемый для разделения уровней в полном пути словаря. Например, если словарь "Статус" имеет два значения "Открыто" и "Закрыто", то полное значение словаря будет "Статус/Открыто" и "Статус/Закрыто". Этот разделитель можно указывать при вызове инструмента перевода или аннотации словаря.
Поддержка различных типов данных Словарь поддерживает различные типы данных, такие как целочисленные, строки и перечисления. При работе с перечислениями используется имя элемента перечисления в качестве источника для конвертации. Примеры использования можно найти в тестовых примерах исходного кода.* Полное преобразование значений/кодов словарей В дополнение к текущему преобразованию значений/кодов словарей, также предоставляется возможность полного преобразования значений/кодов словарей со всеми родительскими значениями/кодами, разделёнными разделителем словарей. Например, если словарь "Статус" имеет два значения "Открыто" и "Закрыто", то текущие значения будут "Открыто" и "Закрыто", а полные значения соответственно "Статус/Открыто" и "Статус/Закрыто". То же самое относится к кодам словарей.*
Каскадные значения словарей
В качестве примера можно рассмотреть каскадный словарь с такими атрибутами как "страна", "город" и "регион". В структуре данных часто присутствуют все эти три свойства одновременно. При переводе вложенного словаря требуется использовать значение родительского словаря. Поддержка этой функциональности реализована через аннотацию, которая используется следующим образом:
country
представляет страну, city
— город, region
— регион.* Изолированные источники данных
Поддерживает наличие нескольких источников данных (нескольких словарей).
private String country;
private String city;
private String region;
@Dictionary(fieldName = {"country"})
private String countryValue;
@Dictionary(fieldName = {"country", "city"})
private String cityValue;
@Dictionary(fieldName = {"country", "city", "region"})
private String regionValue;
directionType
, например: private String countryName;
@Dictionary(fieldName = "countryName", directionType = DirectionType.NameToCode)
private String countryCode;
cloud.agileframework.dictionary.DictionaryDataManager
. Например, можно использовать MySQL для хранения данных словаря. Структура данных словаря должна соответствовать интерфейсу cloud.agileframework.dictionary.DictionaryDatabase
. При переходе на использование MySQL разработчики должны будут наследовать ORM-маппинг таблицы словаря от этого интерфейса и реализовать его методы.* Настройка соединения компонента
По умолчанию включенный компонент можно настроить, установив параметр agile.dictionary.enable=true
. Этот параметр по умолчанию имеет значение true. Пользователи также могут использовать механизм исключения Spring Boot для исключения загрузки компонента.Первый проект начинается очень просто.
Вы можете скачать пакет с последней стабильной версией. Пакет уже загружен в центральный Maven-репозиторий и может быть указан непосредственно в pom.xml.
Пример использования версии agile-dictionary-2.1.0.M5.jar.
<!-- Объявление центрального репозитория -->
<repository>
<id>central</id>
<url>https://repo1.maven.org/maven2/</url>
</repository>
<!-- Добавление зависимости -->
<dependency>
<groupId>cloud.agileframework</groupId>
<artifactId>agile-dictionary</artifactId>
<version>2.1.0.M5</version>
</dependency>
/**
* Преобразование объекта словаря
*
* @param fullCode полный путь словарной записи, например status.yes
* @return объект данных словаря
*/
public static DictionaryDataBase coverDicBean(String fullCode);
/**
* Преобразование объекта словаря
*
* @param fullCode полный путь словарной записи, например status-yes
* @param splitChar пользовательский разделитель, например '-'
* @return объект данных словаря
*/
public static DictionaryDataBase coverDicBean(String fullCode, String splitChar);
``` /**
* Преобразование объекта словаря
*
* @param fullName полный путь значения словаря
* @return объект данных словаря
*/
public static DictionaryDataBase convertDictionaryBeanByFullName(String fullName);
/**
* Преобразование объекта словаря
*
* @param fullName полный путь значения словаря
* @param splitChar пользовательский разделитель
* @return объект данных словаря
*/
public static DictionaryDataBase convertDictionaryBeanByFullName(String fullName, String splitChar);
/**
* Получение словаря по родительской словарной записи и значению подсловаря
*
* @param parentCode родительская словарная запись
* @param name значение подсловаря
* @return данные словаря
*/
public static DictionaryDataBase convertDictionaryBeanByParent(String parentCode, String name);
/**
* Преобразование кода в значение словаря
*
* @param fullCodes полный путь словарной записи, поддерживаются множественные записи с разделителем запятой, результат - значения без полного пути, разделённые запятой
* @return значения словаря
*/
public static String convertDictionaryName(String fullCodes);
/**
* Преобразование кода в значение словаря
*
* @param fullCodes полный путь словарной записи, поддерживаются множественные записи с разделителем запятой, результат - значения без полного пути, разделённые запятой
* @param defaultName значение по умолчанию при отсутствии соответствия
* @return значения словаря
*/
public static String convertDictionaryName(String fullCodes, String defaultName);```java
/**
* Преобразование значений словаря на основе родительского словаря и нескольких дочерних словарей (разделены запятой)
*
* @param parentCode Код полного пути родительского словаря
* @param codes Коллекция кодов дочерних словарей, разделённых запятой
* @param defaultValue Значение по умолчанию
* @return Коллекция значений дочерних словарей без полного пути, разделённых запятой
*/
public static String coverDicNameByParent(String parentCode, String codes, String defaultValue);
/**
* Преобразование значений словарей на основе родительского словаря и множественного потомков (через запятую)
*
* @param parentCode Полный путь родительского кода словаря
* @param codes Коллекция кодов потомков, разделённых запятыми
* @param defaultValue Значение по умолчанию
* @param isFull Режим полного пути для перевода (true - да, false - нет)
* @param splitChar Пользовательский разделитель
* @return Значения словаря, разделённые запятыми
*/
public static String coverDicNameByParent(String parentCode, String codes, String defaultValue, boolean isFull, String splitChar);
``` /**
* Преобразование кода в значение словаря
*
* @param fullCodes Полный путь кода словаря, поддерживающий несколько полных путей через запятую, результат — значения словаря, разделённые запятыми
* @param defaultName Значение по умолчанию при отсутствии словаря
* @param isFull true — полное имя, false — значение словаря
* @param splitChar Пользовательский разделитель
* @return Значение словаря
*/
public static String coverDicName(String fullCodes, String defaultName, boolean isFull, String splitChar);
/**
* Преобразование значения словаря в код словаря
*
* @param fullNames Полный путь значения словаря, поддерживающий несколько полных путей через запятую, результат — коллекция кодов словаря, разделённых запятыми
* @return Код словаря
*/
public static String coverDicCode(String fullNames);
/**
* Преобразование значения словаря в код словаря
* @param defaultCode Значение по умолчанию при отсутствии словаря
* @param fullNames Полный путь значения словаря, поддерживающий несколько полных путей через запятую, результат — коллекция кодов словаря, разделённых запятыми
* @return Код словаря
*/
public static String coverDicCode(String fullNames, String defaultCode); /**
* Преобразование значений словаря на основе родительского значения и множества потомков (через запятую)
*
* @param parentName Полный путь родительского значения словаря
* @param names Коллекция значений потомков, разделённых запятыми
* @return Коллекция кодов потомков, разделённых запятыми, без полного пути
*/
public static String coverDicCodeByParent(String parentName, String names); /**
* Преобразование значений словаря на основе родительского значения и множества потомков (через запятую)
*
* @param parentName Полный путь родительского значения словаря
* @param names Коллекция значений потомков, разделённых запятыми
* @param defaultValue Значение по умолчанию
* @return Коллекция кодов потомков, разделённых запятыми, без полного пути
*/
public static String coverDicCodeByParent(String parentName, String names, String defaultValue);
/**
* Преобразование словарной кодировки на основе значений родительского словаря и значений дочерних словарей (через запятую)
*
* @param parentName Полное имя родительского словаря
* @param names Коллекция значений дочерних словарей, разделённых запятыми
* @param defaultValue Значение по умолчанию
* @param isFull Признак полного пути при переводе
* @param splitChar Разделитель
* @return Словарная кодировка, разделённая запятыми
*/
public static String coverDicCodeByParent(String parentName, String names, String defaultValue, boolean isFull, String splitChar);
/**
* Преобразование кодировки в значение словаря
*
* @param fullNames Полное имя словаря, поддерживающее несколько полных имён словарей через запятую, результат — кодировка словаря без полного имени, разделённая запятыми
* @param defaultName Значение по умолчанию
* @param isFull true если полное имя, false если значение словаря
* @param splitChar Разделитель
* @return Кодировка словаря
*/
public static String coverDicCode(String fullNames, String defaultName, boolean isFull, String splitChar); /**
* Инструмент преобразования коллекций в словарную кодировку, преобразует в тип List/Map
*
* @param list Коллекция для преобразования
* @param dictionaryCode Используемый словарь
* @param suffix Конечный суффикс для хранения значения словаря
* @param column Количество колонок для преобразования
* @param <T> Генерик
* @return Возвращает тип List/Map с добавленным _text полем
* @throws NoSuchFieldException Исключение "нет такого поля"
* @throws IllegalAccessException Исключение "недопустимый доступ"
*/
public static <T> List<Map<String, Object>> coverMapDictionary(List<T> list, String dictionaryCode, String suffix, String column);```markdown
/**
* Преобразование объекта в словарь
*
* @param o Объект POJO или Map
* @param dictionaryCodes Словарные кодировки для колонок, количество должно совпадать с количеством колонок
* @param suffix Заключительный суффикс для хранения значения словаря
* @param columns Колонки для преобразования
* @param <T> Генерик
* @return Преобразованное значение Map
* @throws NoSuchFieldException Исключение "нет такого поля"
* @throws IllegalAccessException Исключение "недопустимый доступ"
*/
public static <T> Map<String, Object> coverMapDictionary(T o, String[] dictionaryCodes, String suffix, String[] columns);
/**
* Инструмент преобразования типов коллекций в список/List/T типа
*
* @param list Коллекция, которую требуется преобразовать
* @param dictionaryCodes Используемые коды словарей
* @param columns Набор полей для преобразования
* @param <T> Генерик
* @return Возвращает список/List/Map типа, поля со словарными кодами автоматически преобразуются в значения словарей
*/
public static <T> List<T> coverBeanDictionary(List<T> list, String[] dictionaryCodes, String[] columns, String[] textColumns, String[] defaultValues);
```Примечание: В данном контексте "generic type" обычно не переводится, так как это общепринятый термин в программировании. Однако, если требуется более подробное объяснение, можно использовать "общий тип".
```markdown
/**
* Автоматическое преобразование словарей, анализирует аннотацию Dictionary
*
* @param o Целевой объект данных
* @param <T> Общий тип
*/
public static <T> void cover(T o);
/**
* Автоматическое преобразование словарей, анализирует аннотацию Dictionary
*
* @param list Целевой список объектов данных
* @param <T> Общий тип
*/
public static <T> void cover(List<T> list);
public static class TuDou {
/**
* Ключ словаря
*/
private String status;
/**
* Приведённое значение словаря после перевода
*/
@Dictionary(fieldName = "status", isFull = true)
private String text;
...
}
Этот объект или этот набор объектов может быть использован в качестве аргумента при вызове метода cover
класса DictionaryUtil
, что приведёт к автоматическому заполнению значения text
с помощью ключа status
.
По умолчанию используется способ хранения в памяти. Когда разработчики хотят использовать пользовательский способ хранения, они могут реализовать или расширить указанные выше интерфейсы и внедрить эти реализации в контейнер Spring.
```markdown
//DictionaryDataBase: базовый класс структурированных данных словаря (обычно используется для ORM отображения таблиц словарей в базе данных), предоставляет id, parentId, children, sort и другие свойства
@Entity
public class MyDictionaryDo extends DictionaryDataBase {
//Примечание
private String commit;
//
}
Инструмент управления пользовательским хранением данных словаря
//AbstractDictionaryDataManager: абстрактный менеджер данных словаря (предоставляет API взаимодействия с уровнем хранения, такие как операции CRUD словаря и синхронизация вторичного кэша)
@Service
public class MyDictionaryService extends AbstractDictionaryDataManager {
...
}
//Общее использование
//Обратите внимание, что методы add, update и другие в MyDictionaryService являются прямыми операциями уровня хранения, тогда как методы add, update и другие внутри sync() выполняют операции уровня хранения + синхронизацию первичного и вторичного кэшей
@Autowired
private MyDictionaryService service;
public void crud(MyDictionaryDo dic) {
//Добавление
service.sync().add(dic);
//Редактирование
service.sync().update(dic);
//Удаление
service.sync().delete(dic);
//Запрос
service.sync().all();
service.sync().tree();
}
Аннотация словаря позволяет определять словарь перевода, направление перевода, полное путь значений, разделители перевода и другие параметры.
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Dictionary {
``` String NULL = "null";
/**
* Код словаря
*/
String dicCode() default "";
/**
* Название поля словаря
*/
String[] fieldName();
/**
* Включает ли полное путь к значениям
*/
boolean isFull() default false;
/**
* Разделитель полного пути к значениям
*/
String split() default ".";
/**
* Направление перевода
*/
DirectionType directionType() default DirectionType.CODE_TO_NAME;
/**
* Значение по умолчанию при отсутствии данных
*/
String defaultValue() default NULL;
/**
* Является ли это первичным ключом
*
* Если является первичным ключом, то вызывается метод findById
*/
boolean id() default false;
/**
* Определение источника данных
*/
String dataSource() default Constant.AgileAbout.DIC_DATASOURCE;
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )