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