Интерфейс Datatype
описывает тип данных, допустимый для атрибута сущности, не являющегося ассоциацией. Каждый экземпляр реализации Datatype
соответствует одному классу Java, для работы с которым он предназначен.
Все экземпляры зарегистрированы в репозитории - классе Datatypes
, который выполняет загрузку и инициализацию классов реализации Datatype
следующим образом:
-
в корне
CLASSPATH
ищется файлdatatypes.xml
, и если он найден, репозиторийDatatypes
инициализируется из него -
в противном случае инициализация
Datatypes
производится из файла/com/haulmont/chile/core/datatypes/datatypes.xml
Экземпляр 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
.
Форматы для преобразований с учетом локали задаются в главном пакете локализованных сообщений, в строках со следующими ключами:
-
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, и могут быть переопределены в аналогичных файлах проекта приложения.