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
.
В следующем разделе описано, как задать форматы преобразований с учетом локали.