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, и могут быть переопределены в аналогичных файлах проекта приложения.