Spec-Zone .ru
спецификации, руководства, описания, API
След: Архитектура Java для XML, Связывающего (JAXB)
Урок: Введение в JAXB
Примеры Java к схеме
Домашняя страница > Архитектура Java для XML, Связывающего (JAXB) > Введение в JAXB

Примеры Java к схеме

Примеры Java к схеме показывают, как использовать аннотации, чтобы отобразить классы Java XML-схемы.

Пример j2s-create-marshal

j2s-create-marshal пример иллюстрирует привязку данных Java к схеме. Это демонстрирует, как упорядочивать и неупорядочивать JAXB аннотируемые классы и также показывает, как включить JAXP, 1.3 проверки допустимости в неупорядочивают время, используя файл схемы, который был сгенерирован от JAXB отображенные классы.

Файл схемы, bc.xsd, был сгенерирован со следующими командами:

schemagen src/cardfile/*.java
cp schema1.xsd bc.xsd

Отметьте, что schema1.xsd был скопирован в bc.xsd; schemagen не позволяет Вам определять имя схемы своего выбора.

Создание и Выполнение j2s-create-marshal Примера Используя Муравья

Чтобы скомпилировать и выполнить j2s-create-marshal пример, используя Муравья, в окне терминала, идут в jaxb-ri-install/samples/j2s-create-marshal/ каталог и вводят следующее:

ant 

Пример j2s-xmlAccessorOrder

Шоу в качестве примера j2s-xmlAccessorOrder, как использовать @XmlAccessorOrder и аннотации @XmlType.propOrder, чтобы продиктовать порядок, в котором контент XML упорядочивается и неупорядочивается по типу Java.

С отображением Java к схеме свойства JavaBean и поля отображаются на тип XML-схемы. Элементы class отображаются или на составной тип XML-схемы или на XML-схему простой тип. Порядок элемента значения по умолчанию на сгенерированный тип схемы является в настоящий момент неуказанным, потому что отражение Java не налагает порядок возврата. Нехватка надежного элемента, упорядочивающего негативно, воздействует на мобильность приложения. Можно использовать две аннотации, @XmlAccessorOrder и @XmlType.propOrder, чтобы определить упорядочивание элемента схемы для приложений, которые должны быть переносимыми через Провайдеров JAXB.

Используя Аннотацию @XmlAccessorOrder, чтобы Определить Упорядочивание Элемента Схемы

Аннотация @XmlAccessorOrder налагает один из двух алгоритмов упорядочивания элемента, AccessorOrder.UNDEFINED или AccessorOrder.ALPHABETICAL. AccessorOrder.UNDEFINED является настройкой по умолчанию. Порядок зависит от отражательной реализации системы. алгоритм AccessorOrder.ALPHABETICAL упорядочивает элементы в лексикографическом порядке как определено java.lang.String.CompareTo(String anotherString).

Можно определить аннотацию @XmlAccessorOrder для типа аннотации ElementType.PACKAGE на объекте class. Когда аннотация @XmlAccessorOrder определяется на пакете, контекст правила форматирования является активным для каждого class в пакете. Когда определено на class, правило является активным на содержании того class.

В пределах пакета могут быть многократные аннотации @XmlAccessorOrder. Самое внутреннее (class) аннотация имеет приоритет по внешней аннотации. Например, если @XmlAccessorOrder(AccessorOrder.ALPHABETICAL) определяется на пакете, и @XmlAccessorOrder(AccessorOrder.UNDEFINED) определяется на class в том пакете, содержание сгенерированного типа схемы для class было бы в неуказанном порядке, и содержание сгенерированного типа схемы для любого class в пакете будет в алфавитном порядке.

Используя Аннотацию @XmlType, чтобы Определить Упорядочивание Элемента Схемы

Аннотация @XmlType может быть определена для class. Элемент аннотации propOrder() в аннотации @XmlType позволяет Вам определить порядок контента в сгенерированном типе схемы. Когда Вы используете аннотацию @XmlType.propOrder на class, чтобы определить порядок контента, все общедоступные свойства и общедоступные поля в class должны быть определены в списке параметров. Любое общедоступное свойство или поле, что Вы хотите держаться в стороне от списка параметров, должны быть аннотированы аннотацией @XmlTransient или @XmlAttribute.

Порядком контента значения по умолчанию на @XmlType.propOrder является {} или {""}, не активный. В таких случаях имеет приоритет активная аннотация @XmlAccessorOrder. Когда порядок контента class определяется аннотацией @XmlType.propOrder, он имеет приоритет по любой активной аннотации @XmlAccessorOrder на class или пакет. Если @XmlAccessorOrder и аннотации @XmlType.propOrder(A, B, ...) определяются на class, propOrder всегда имеет приоритет независимо от порядка операторов аннотации. Например, в следующем сегменте кода, аннотация @XmlAccessorOrder предшествует аннотации @XmlType.propOrder.

@XmlAccessorOrder(AccessorOrder.ALPHABETICAL)
@XmlType(propOrder={"name", "city"})

public class USAddress {
    // ...
    public String getCity() {return city;}
    public void setCity(String city) {this.city = city;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    // ...
}

В следующем сегменте кода аннотация @XmlType.propOrder предшествует аннотации @XmlAccessorOrder.

@XmlType(propOrder={"name", "city"})
@XmlAccessorOrder(AccessorOrder.ALPHABETICAL)
public class USAddress {
    // ...
    public String getCity() {return city;}
    public void setCity(String city) {this.city = city;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    // ...
}

В обоих сценариях имеет приоритет propOrder, и следующий идентичный контент схемы сгенерирован:

<xs:complexType name="usAddress">
    <xs:sequence>
        <xs:element 
            name="name" 
            type="xs:string" 
            minOccurs="0"/>
        <xs:element 
            name="city" 
            type="xs:string" 
            minOccurs="0"/>
    </xs:sequence>
</xs:complexType>

Упорядочивание Контента схемы в Примере

Пример кода заказа на поставку демонстрирует эффекты упорядочивания контента схемы, используя аннотацию @XmlAccessorOrder в пакете и уровне class, и аннотацию @XmlType.propOrder на class.

Класс package-info.java определяет @XmlAccessorOrder, чтобы быть ALPHABETICAL для пакета. На общедоступные поля shipTo и billTo in class PurchaseOrderType влияет в сгенерированном порядке контента схемы это правило. USAddress класса определяет аннотацию @XmlType.propOrder на class, который демонстрирует определяемый пользователем порядок свойства, заменяющий порядок ALPHABETICAL в сгенерированной схеме.

Сгенерированный файл схемы может быть найден в jaxb-ri-install/samples/j2s-xmlAccessorOrder/build/schemas/ каталоге.

Создание и Выполнение Примера j2s-xmlAccessorOrder Используя Муравья

Чтобы скомпилировать и выполнить пример j2s-xmlAccessorOrder, используя Муравья, в окне терминала, идут в jaxb-ri-install/samples/j2s-xmlAccessorOrder/ каталог и вводят следующее:

ant 

Пример j2s-xmlAdapter

j2s-xmlAdapter пример демонстрирует, как использовать интерфейс XmlAdapter и аннотацию @XmlJavaTypeAdapter, чтобы обеспечить пользовательское отображение контента XML в и из HashMap (поле), которое использует int в качестве ключа и String как значение.

Соедините интерфейсом с XmlAdapter и аннотацией, @XmlJavaTypeAdapter используется для специальной обработки типов данных во время немаршалинга и маршалинга. Есть множество типов данных XML, для которых представление не отображается легко в Java (например, xs:DateTime и xs:Duration), и типы Java, которые не отображаются должным образом в представления XML. Например, реализации java.util.Collection (такие как List) и java.util.Map (такие как HashMap) или для классов non-JavaBean.

Интерфейс XmlAdapter и аннотация @XmlJavaTypeAdapter обеспечиваются для случаев, таких как они. Эта комбинация обеспечивает переносимый механизм для чтения и вписать в контент XML и из приложений Java.

Интерфейс XmlAdapter определяет методы для считывания данных и записи.

/*
 *  ValueType - Java class that provides an 
 *  XML representation of the data. 
 *  It is the object that is used for marshalling and 
 *  unmarshalling.
 *
 *  BoundType - Java class that is used to 
 *  process XML content.
 */
 
public abstract class XmlAdapter<ValueType,BoundType> {

    // Do-nothing constructor for the derived classes.
    protected XmlAdapter() {}
    
    // Convert a value type to a bound type.
    public abstract BoundType unmarshal(ValueType v);
    
    // Convert a bound type to a value type.
    public abstract ValueType marshal(BoundType v);
}

Можно использовать аннотацию @XmlJavaTypeAdapter, чтобы связать определенную реализацию XmlAdapter с типом Target, PACKAGE, FIELD, METHOD, TYPE, или PARAMETER.

j2s-xmlAdapter пример показывает, как использовать XmlAdapter для того, чтобы отобразить контент XML в и из (пользовательского) HashMap. Объект HashMap, basket, в class KitchenWorldBasket, использует ключ типа int и значение типа String. Эти типы данных должны быть отражены в контенте XML, который читается и пишется, таким образом, контент XML должен смотреть как в следующем примере:

<basket>
    <entry key="9027">glasstop stove in black</entry>
    <entry key="288">wooden spoon</entry>
</basket>

Схема значения по умолчанию, сгенерированная для типа Java HashMap, не отражает требуемый формат.

<xs:element name="basket">
    <xs:complexType>
        <xs:sequence>
            <xs:element 
                name="entry" 
                minOccurs="0" 
                maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element 
                            name="key" 
                            minOccurs="0"
                            type="xs:anyType"/>
                        <xs:element 
                            name="value" 
                            minOccurs="0" 
                            type="xs:anyType"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

В значении по умолчанию схема HashMap, ключ и значение являются оба элементами и являются типа данных anyType. Контент XML похож на следующее:

<basket>
    <entry>
        <key>9027</key>
        <value>glasstop stove in black</value>
    </entry>
    <entry>
        <key>288</key>
        <value>wooden spoon</value>
    </entry>
</basket>

Чтобы решить этот вопрос, пример использует два класса Java, PurchaseList и PartEntry, которые отражают необходимый формат схемы для немаршалинга и маршалинга контента. XML-схема, сгенерированная для этих классов, следующие:

<xs:complexType name="PurchaseListType">
    <xs:sequence>
        <xs:element 
            name="entry" 
            type="partEntry"
            nillable="true" 
            maxOccurs="unbounded"
            minOccurs="0"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="partEntry">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute
                name="key" 
                type="xs:int"
                use="required"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

Класс AdapterPurchaseListToHashMap реализует интерфейс XmlAdapter. В class KitchenWorldBasket аннотация @XmlJavaTypeAdapter используется, чтобы соединить AdapterPurchaseListToHashMap с полем HashMap basket. Это соединение вызывает упорядочивание, или неупорядочьте метод AdapterPurchaseListToHashMap, который вызовут для любого соответствия, упорядочивают или неупорядочивают действие на KitchenWorldBasket.

Создание и Выполнение j2s-xmlAdapter Примера Используя Муравья

Чтобы скомпилировать и выполнить j2s-xmlAdapter пример, используя Муравья, в окне терминала, идут в jaxb-ri-install/samples/j2s-xmlAdapter/ каталог и вводят следующее:

ant

Пример j2s-xmlAttribute

j2s-xmlAttribute пример показывает, как использовать аннотацию @XmlAttribute, чтобы определить свойство или поле, которое будет обработано как атрибут XML.

Аннотация @XmlAttribute отображает поле или свойство JavaBean к атрибуту XML. Следующие правления навязываются:

Следуя за парадигмой программирования JavaBean, свойство определяется get и префиксом set на имени поля.

int zip;
public int getZip(){return zip;}
public void setZip(int z){zip=z;}

В пределах боба class у Вас есть выбор установки аннотации @XmlAttribute на один из трех компонентов: поле, метод метода set, или метод метода get. Если Вы устанавливаете аннотацию @XmlAttribute на поле, метод метода set должен быть переименован или во время компиляции будет конфликт имен. Если Вы устанавливаете аннотацию @XmlAttribute на один из методов, это должно быть установлено или на методе set или на методе метода get, но не на обоих.

Пример XmlAttribute показывает, как использовать аннотацию @XmlAttribute на статическое заключительное поле, на поле, а не на одном из соответствующих бобовых методов, на бобовом свойстве (метод), и на поле, которое является кроме типа набора. В class USAddress, поля, страна, и zip тегируются как атрибуты. Метод setZip был отключен, чтобы избежать ошибки компиляции. Состояние свойства было тегировано как атрибут на методе метода set. Вы, возможно, использовали метод метода get вместо этого. В class PurchaseOrderType поле cCardVendor является типом ненабора. Это удовлетворяет требование того, чтобы быть простым типом; это - тип enum.

Создание и Выполнение j2s-xmlAttribute Примера Используя Муравья

Чтобы скомпилировать и выполнить j2s-xmlAttribute пример, используя Муравья, в окне терминала, идут в jaxb-ri-install/samples/j2s-xmlAttribute/ каталог и вводят следующее:

ant

Пример j2s-xmlRootElement

Пример j2s-xmlRootElement демонстрирует использование аннотации @XmlRootElement, чтобы определить имя элемента XML для типа XML-схемы соответствующего class.

Аннотация @XmlRootElement отображает class или тип enum к элементу XML. По крайней мере одно определение элемента необходимо для каждого высокоуровневого типа Java, используемого для немаршалинга и маршалинга. Если нет никакого определения элемента, нет никакого начального расположения для обработки контента XML.

Аннотация @XmlRootElement использует имя class в качестве имени элемента значения по умолчанию. Можно изменить имя по умолчанию при использовании атрибута аннотации name. Если Вы делаете, указанное имя используется в качестве имени элемента и имени типа. Это - общая практика схемы для имен элементов и имен типов, чтобы отличаться. Можно использовать аннотацию @XmlType, чтобы установить имя типа элемента.

Атрибут пространства имен аннотации @XmlRootElement используется, чтобы определить пространство имен для элемента.

Создание и Выполнение Примера j2s-xmlRootElement Используя Муравья

Чтобы скомпилировать и выполнить пример j2s-xmlRootElement, используя Муравья, в окне терминала, идут в jaxb-ri-install/samples/j2s-xmlRootElement/ каталог и вводят следующее:

ant

Пример j2s-xmlSchemaType

Пример j2s-xmlSchemaType демонстрирует использование аннотации @XmlSchemaType, чтобы настроить отображение свойства или поля к XML встроенный тип.

Аннотация @XmlSchemaType может использоваться, чтобы отобразить тип Java на один из XML встроенные типы. Эта аннотация является самой полезной в отображении типа Java к одной из девяти дат/времен примитивные типы данных.

Когда аннотация @XmlSchemaType определяется на уровне пакета, идентификация требует и XML, встроенное имя типа и соответствующий Java вводят class. Определение @XmlSchemaType на поле или свойстве имеет приоритет по определению пакета.

Пример Класса XmlSchemaType показывает, как использовать аннотацию @XmlSchemaType на уровне пакета на поле, и на свойстве. У TrackingOrder файла есть два поля, orderDate и deliveryDate, которые определяются, чтобы иметь тип XMLGregorianCalendar. Сгенерированная схема определит эти элементы, чтобы быть XML встроенным типом gMonthDay. Это отношение было определено на пакете в файле package-info.java. Поле shipDate в файле, TrackingOrder также определяется, чтобы иметь тип XMLGregorianCalendar, но операторы аннотации @XmlSchemaType, переопределяет определение пакета и определяет поле, чтобы иметь тип date. Метод getTrackingDuration свойства определяет элемент схемы, который будет определен как тип примитива duration и не тип Java String.

Создание и Выполнение Примера j2s-xmlSchemaType Используя Муравья

Чтобы скомпилировать и выполнить пример j2s-xmlSchemaType, используя Муравья, в окне терминала, идут в jaxb-ri-install/samples/j2s-xmlSchemaType/ каталог и вводят следующее:

ant 

Пример j2s-xmlType

j2s-xmlType пример демонстрирует использование аннотации @XmlType. Аннотация @XmlType отображает class или тип enum к типу XML-схемы.

У class должны быть или общедоступный конструктор нулевого параметра или статический метод фабрики нулевого параметра, чтобы быть отображенным этой аннотацией. Один из этих методов используется во время немаршалинга, чтобы создать экземпляр class. Метод фабрики может быть расположен в пределах на фабрике class или существующий class.

Есть порядок очередности, относительно которого метод используется для того, чтобы неупорядочить:

В этом примере фабрика class обеспечивает нулевые методы фабрики аргумента для нескольких классов. Аннотация @XmlType на class OrderContext ссылается на фабрику class. unmarshaller использует идентифицированный метод фабрики в этом class.

public class OrderFormsFactory {

    public OrderContext newOrderInstance() {
        return new OrderContext()
    }

    public PurchaseOrderType {
        newPurchaseOrderType() {
            return new newPurchaseOrderType();
        }
    }
    
    @XmlType(name="oContext",
        factoryClass="OrderFormsFactory",
        factoryMethod="newOrderInstance")
    public class OrderContext {
        public OrderContext() {
            // ...
        }
    }
}

В этом примере метод фабрики определяется в class, который также содержит стандартную конструкцию class. Поскольку значение factoryMethod определяется, и никакой factoryClass не определяется, метод newOrderInstance фабрики используется во время немаршалинга.

@XmlType(name="oContext", 
    factoryMethod="newOrderInstance")
public class OrderContext {

    public OrderContext() {
        // ...
    }

    public OrderContext newOrderInstance() {
        return new OrderContext();
    }
}

Создание и Выполнение j2s-xmlType Примера Используя Муравья

Чтобы скомпилировать и выполнить j2s-xmlType пример, используя Муравья, в окне терминала, идут в jaxb-ri-install/samples/j2s-xmlType/ каталог и вводят следующее:

ant

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Настройка Привязка JAXB
Следующая страница: Для получения дополнительной информации