Статьи

Повторное использование сгенерированных классов JAXB

В этой статье я покажу, как использовать расширение XJCepisode для повторного использования классов, ранее сгенерированных из XML-схемы. Это полезно, когда XML-схема импортируется другими XML-схемами, и вы не хотите, чтобы одни и те же классы генерировались каждый раз.

Импортированная схема (Product.xsd)

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<schema
    targetNamespace="<a href="http://www.example.org/Product">http://www.example.org/Product</a>"
    elementFormDefault="qualified">
    <element name="product">
        <complexType>
            <sequence>
                <element name="id" type="string"/>
                <element name="name" type="string"/>
            </sequence>
        </complexType>
    </element>
</schema>

Поскольку несколько XML-схем импортируют Product.xsd, мы можем использовать файлы эпизодов, чтобы классы, соответствующие Product.xsd , создавались только один раз. Следующий вызов XJC демонстрирует, как создать файл эпизода с именем product. эпизод вместе с сгенерированными классами:

1
xjc -d out -episode product.episode Product.xsd

Схема импорта (ProductPurchaseRequest.xsd)

Ниже приведен пример XML-схемы, которая импортирует Product.xsd:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<schema
    elementFormDefault="qualified">
    <import namespace="<a href="http://www.example.org/Product">http://www.example.org/Product</a>" schemaLocation="Product.xsd"/>
    <element name="purchase-request">
        <complexType>
            <sequence>
                <element ref="prod:product" maxOccurs="unbounded"/>
            </sequence>
        </complexType>
    </element>
</schema>

Когда мы генерируем классы из этой схемы XML, мы ссылаемся на файл эпизода, который мы создали, когда генерировали классы Java из Product.xsd . Если мы не укажем файл эпизода, будут сгенерированы классы как для ProductPurchaseRequest.xsd, так и для Product.xsd :

Другая схема импорта (ProductQuoteRequest.xsd)

Ниже приведен еще один пример схемы XML, которая импортирует Product.xsd:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<schema
    elementFormDefault="qualified">
    <import namespace="<a href="http://www.example.org/Product">http://www.example.org/Product</a>" schemaLocation="Product.xsd"/>
    <element name="quote">
        <complexType>
            <sequence>
                <element ref="prod:product"/>
            </sequence>
        </complexType>
    </element>
</schema>

Опять же, когда мы генерируем классы из этой схемы XML, мы ссылаемся на файл эпизода, который мы создали, когда генерировали классы Java из Product.xsd.

1
xjc -d out ProductQuoteRequest.xsd -extension -b product.episode

Как это работает? (product.episode)

Для тех из вас, любопытно, как это работает. Файл эпизода, сгенерированный XJC, на самом деле является просто стандартным файлом привязок JAXB, который используется для настройки генерации класса. Этот сгенерированный файл привязок / эпизодов содержит записи, которые сообщают XJC, что класс для этого типа уже существует. Вы можете написать этот файл вручную, но флаг -episode для XJC сделает это за вас.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bindings version="2.1" xmlns="<a href="http://java.sun.com/xml/ns/jaxb">http://java.sun.com/xml/ns/jaxb</a>">
<!--
 
This file was generated by the JavaTM Architecture for XML Binding
(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 See
Any modifications to this file will be lost upon recompilation of the
source schema.
Generated on: 2011.11.02 at 03:40:10 PM EDT
 
-->
<bindings scd="x-schema::tns"
<schemaBindings map="false"/>
<bindings scd="tns:product">
<class ref="org.example.product.Product"/>
</bindings>
</bindings>
</bindings>

Ссылка: повторное использование сгенерированных классов JAXB от нашего партнера по JCG Блейза Дафана в блоге Java XML & JSON Binding .

Статьи по Теме :