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