This topic applies only to the IBM Business Process Manager Advanced configuration.

Применение 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.

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