
Применение AnySimpleType для простых типов
AnySimpleType обрабатывается API бизнес-объектов способом, подобным способу обработки других простых типов (например string, int, boolean и других).
Между anySimpleType и другими простыми типами существует только два различия: экземпляр, в котором данные могут быть преобразованы и поле или из поля, и способ сериализации этих данных экземпляра.
Если требуется вызвать метод set(...) для типа string, то сначала данные будут преобразованы в строку, а исходный тип данных будет утерян:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://StringType">
<xsd:complexType name="StringType">
<xsd:sequence>
<xsd:element name="foo" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
DataObject stringType = ...
// Присвоить данные объекту типа String
stringType.set("foo", "bar");
// Данные экземпляра всегда будут иметь тип String независимо от типа присваиваемых данных
// Выводит "java.lang.String"
System.out.println(stringType.get("foo").getClass().getName());
// Присвоить данные объекту типа Integer
stringType.set("foo", new Integer(42));
// Данные экземпляра всегда будут иметь тип String независимо от типа присваиваемых данных
// Выводит "java.lang.String"
System.out.println(stringType.get("foo").getClass().getName());
Если требуется вызвать метод set(...) для anySimpleType, то исходные данные не будут утеряны.
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://AnySimpleType">
<xsd:complexType name="AnySimpleType">
<xsd:sequence>
<xsd:element name="foo" type="xsd:anySimpleType"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
DataObject anySimpleType = ...
// Присвоить данные объекту типа String
anySimpleType.set("foo", "bar");
// Данные экземпляра всегда будут иметь тип данных, заданный методом set
// Выводит "java.lang.String"
System.out.println(anySimpleType.get("foo").getClass().getName());
// Присвоить данные объекту типа Integer
anySimpleType.set("foo", new Integer(42));
// Данные экземпляра всегда будут иметь тип данных, заданный методом set
// Выводит "java.lang.Integer"
System.out.println(anySimpleType.get("foo").getClass().getName());
Этот тип данных также сохраняется в процессе сериализации и десериализации с помощью xsi:type. Следовательно, при каждой сериализации элемента anySimpleType он будет иметь xsi:type, совпадающий с тем, который определен в спецификации SDO на основании типа Java™:
В следующем примере бизнес-объект сериализуется, и данные выглядят следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<p:StringType xsi:type="p:StringType"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:xsd=http://www.w3.org/2001/XMLSchema
xmlns:p="http://StringType">
<foo xsi:type="xsd:int">42</foo>
<p:StringType></p:StringType>
Во время десериализации xsi:type будет использоваться для загрузки данных как соответствующего класса экземпляра Java. Если xsi:type не указан, то стандартным типом десериализации будет строка.
Для других простых типов определение способа преобразования данных является постоянным. Например, булевское значение всегда может быть преобразовано в строку. AnySimpleType может содержать любые простые типы, однако возможность преобразования зависит от данных экземпляра в поле.
Для того чтобы определить, имеет ли свойство тип anySimpleType, воспользуйтесь свойствами Type URI и Name. Они будут иметь значения "commonj.sdo" и "Object". Для того чтобы определить, являются ли данные допустимыми для вставки в anySimpleType, убедитесь, что они не являются экземпляром DataObject. Данные, которые возможно представить в виде строки и которые не являются DataObject, можно указать в поле anySimpleType.
Этим обусловлены следующие правила преобразования:
- anySimpleType всегда возможно преобразовать в anySimpleType;
- любой другой простой тип всегда возможно преобразовать в anySimpleType;
- anySimpleType всегда возможно преобразовать в строку, поскольку все простые типы должны быть способны преобразовываться в строку;
- anySimpleType может быть способен к преобразованию в любой другой простой тип в зависимости от его значения в бизнес-объекте. Преобразование невозможно определить во время разработки. Оно определяется во время выполнения.