2010-07-12 5 views
2

В моей схеме у меня есть некоторые типы, которые просто расширяют простой тип XSD (int или string). JAXB создает отдельный класс java для такого типа. Я хочу отказаться от этого промежуточного класса и настроить JAXB на использование примитивов, где это возможно (например, заменить CountryType на java.lang.String и DocumentType с int или lava.lang.Integer). Например, для данного XSD было бы неплохо иметь DestinationType.setDocumentType(int) и List<String> StatesType.getCountry(). Я рад написать для него тип an adapter, но похоже, что поддерживаются только преобразования из примитивных типов XML. Может быть, можно сделать преобразование типа для каждого объекта? Пожалуйста, дайте любой пример настройки привязки JAXB, который может помочь.JAXB замена сложного типа примитивным типом

<?xml version="1.0" encoding="UTF-8"?> 
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:exch="http://www.mycompany.org/exchange" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    targetNamespace="http://www.mycompany.org/exchange" 
    elementFormDefault="qualified" attributeFormDefault="unqualified"> 

    <complexType name="countryType"> 
     <simpleContent> 
      <extension base="string"/> 
     </simpleContent> 
    </complexType> 

    <complexType name="statesType"> 
     <sequence maxOccurs="unbounded"> 
      <element name="country" type="exch:countryType"/> 
     </sequence> 
    </complexType> 

    <complexType name="documentType"> 
     <simpleContent> 
      <extension base="integer"/> 
     </simpleContent> 
    </complexType> 

    <complexType name="destinationType"> 
     <sequence> 
      <element name="states" type="exch:statesType" maxOccurs="1"/> 
      <element name="document-type" type="exch:documentType" minOccurs="1" maxOccurs="1"/> 
     </sequence> 
    </complexType> 
</schema> 

ответ

2

Другая возможность, вы можете изменить схему ?:

Следующее изменение схемы будет генерировать нужную модель объекта.

Использование:

<simpleType name="documentType"> 
    <restriction base="integer"/> 
</simpleType> 

Вместо:

<complexType name="documentType"> 
    <simpleContent> 
     <extension base="integer"/> 
    </simpleContent> 
</complexType> 
+0

Может это преобразование применяются без нарушения совместимости сериализованного XML? –

+0

@dma_k - Да, представления XML для обоих типов одинаковы. –

0

Хороший вопрос. Раньше я решил это, выполнив схему с помощью этапа предварительной обработки XSLT, «сглаживания» иерархии типов, сохраняя при этом семантику документов.

Например, XSLT опустит определение типа documentType и заменит каждую ссылку на documentType на integer. Результирующая обработанная схема по-прежнему представляет собой один и тот же экземпляр документов, но проще и делает более удобной привязку.

Это (довольно полувыпеченное) решение может применяться к ряду аналогичных проблем, связанных с чрезмерно сложной схемой (например, заменой групп замещения на структуры выбора).

Смежные вопросы