3.2.2.3. Datatype

Интерфейс Datatype определяет методы конвертации значение в строку и из строки (formatting & parsing). Каждый атрибут сущности, не являющийся ссылкой, имеет некоторый Datatype, который и используется фреймворком для конвертации значений данного атрибута.

Экземпляры Datatype регистрируются в бине DatatypeRegistry, который выполняет загрузку и инициализацию классов реализации Datatype из файлов metadata.xml компонентов приложения и самого проекта.

Datatype атрибута сущности может быть получен из соответствующего meta-property методом getRange().asDatatype().

Кроме конвертации значений атрибутов сущностей, зарегистрированные экземпляры Datatype могут быть использованы для преобразования в строку и из строки произвольных значений поддерживаемых типов. Для этого необходимо получить экземпляр Datatype из DatatypeRegistry с помощью его методов get(Class) или getNN(Class), передавая тип Java, который необходимо конвертировать.

Datatype сопоставляется атрибуту сущности по следующим правилам:

  • Как правило, атрибуту сопоставляется экземпляр Datatype, зарегистрированный в DatatypeRegistry и предназначенный для конвертации типа атрибута.

    Например, в данном случае атрибут amount получит BigDecimalDatatype:

    @Column(name = "AMOUNT")
    private BigDecimal amount;

    потому что в com/haulmont/cuba/metadata.xml есть следующий элемент:

    <datatype id="decimal" class="com.haulmont.chile.core.datatypes.impl.BigDecimalDatatype"
              default="true"
              format="0.####" decimalSeparator="." groupingSeparator=""/>
  • Для поля или метода можно задать аннотацию @MetaProperty, указав в ней атрибут datatype.

    Например, атрибут issueYear получит тип YearDatatype:

    @MetaProperty(datatype = "year")
    @Column(name = "ISSUE_YEAR")
    private Integer issueYear;

    если файл metadata.xml проекта содержит следующий элемент:

    <datatype id="year" class="com.company.sample.YearDatatype"/>

    Как видно, атрибут datatype аннотации @MetaProperty указывает на идентификатор, который использован при регистрации класса имплементации Datatype в файле metadata.xml.

Основные методы интерфейса Datatype:

  • format() - преобразовывает переданное значение в строку

  • parse() - преобразовывает строку в значение нужного типа

  • getJavaClass() – возвращает тип Java, для конвертации которого создан данный Datatype. Этот метод имеет реализацию по умолчанию, которая считывает значение аннотации @JavaClass, если она присутствует на классе.

Datatype определяет два набора методов для форматирования/парсинга: с учетом локали и без учета локали. Преобразование с учетом локали используется повсеместно в пользовательском интерфейсе, преобразование без учета локали используется в системных механизмах, например, для сериализации в REST API.

Форматы для преобразований без учета локали задаются в коде имплементации или в файле metadata.xml.

В следующем разделе описано, как задать форматы преобразований с учетом локали.