4.2.2.3. Datatype
Интерфейс Datatype
описывает тип данных, допустимый для атрибута сущности, не являющегося ссылкой.
Экземпляры Datatype
регистрируются в репозитории - классе Datatypes
, который выполняет загрузку и инициализацию классов реализации Datatype
следующим образом:
-
Стандартные реализации
Datatype
загружаются из classpath-ресурса/com/haulmont/chile/core/datatypes/datatypes.xml
. -
Сканируются файлы metadata.xml компонентов приложения и самого проекта на предмет наличия элемента
datatypes
, и если он найден, загружаются кастомные реализацииDatatype
. См. пример создания кастомного типа данных ниже. -
Для обратной совместимости, в корне
CLASSPATH
ищется файлdatatypes.xml
, и если он найден, стандартные реализацииDatatype
инициализируется из него вместо ресурса, упомянутого выше.
Экземпляр Datatype
может быть получен двумя способами:
-
для атрибута сущности из соответствующего ему мета-свойства типа DATATYPE, вызовом
getRange().asDatatype()
-
статическим методом
Datatypes.get()
, передавая в него имя реализацииDatatype
или класс Java, для которого он создан.
Datatype
сопоставляется атрибуту сущности на старте системы по следующим правилам:
-
Если для поля или метода задана аннотация
@MetaProperty
с непустым значениемdatatype
, то атрибуту сопоставляется экземплярDatatype
с данным именем.Например, при следующем объявлении атрибута сущности он получит нестандартный тип
GeoCoordinateDatatype
(см. пример ниже):@MetaProperty(datatype = GeoCoordinateDatatype.NAME) @Column(name = "LATITUDE") private Double latitude;
-
Как правило, явное указание отсутствует, и атрибуту сопоставляется экземпляр
Datatype
, возвращаемый репозиториемDatatypes.get(Class)
, при передаче в него типа поля или метода.Например, в данном случае атрибут
latitude
получит стандартный типDoubleDatatype
, зарегистрированный в ресурсе/com/haulmont/chile/core/datatypes/datatypes.xml
:@Column(name = "LATITUDE") private Double latitude;
Основные методы интерфейса Datatype
:
-
getName()
- возвращает уникальное имя данной реализации -
format()
- преобразовывает переданное значение в строку -
parse()
- преобразовывает строку в значение нужного типа
Datatype
определяет два набора методов для форматирования/парсинга: с учетом локали и без учета локали. Преобразование с учетом локали используется повсеместно в пользовательском интерфейсе, преобразование без учета локали используется в системных механизмах, например, для сериализации в REST API.
Форматы для преобразований без учета локали задаются в вышеупомянутом ресурсе datatypes.xml
или в элементе datatypes
файла metadata.xml
.
Форматы для преобразований с учетом локали задаются в главном пакете локализованных сообщений, в строках со следующими ключами:
-
numberDecimalSeparator
- задает символ разделителя целой и дробной части для числовых типов -
numberGroupingSeparator
- задает символ разделителя групп разрядов для числовых типов -
integerFormat
- формат для типовInteger
иLong
-
doubleFormat
- формат для типаDouble
-
decimalFormat
- формат для типаBigDecimal
-
dateTimeFormat
- формат для типаjava.util.Date
-
dateFormat
- формат для типаjava.sql.Date
-
timeFormat
- формат для типаjava.sql.Time
-
trueString
- строка, соответствующаяBoolean.TRUE
-
falseString
- строка, соответствующаяBoolean.FALSE
Все перечисленные форматы по умолчанию заданы в главном пакете локализованных сообщений компонента CUBA, и могут быть переопределены в аналогичных файлах проекта приложения.