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