2009-12-10 4 views
17

У меня есть существующая схема XML, которая содержит тип, который я хотел бы сопоставить с какой-либо Java-картой, используя JAXB. Мой процесс сборки принимает схему и создает компоненты. Я хотел бы настроить этот процесс, указав один из complexTypes на моей карте схемы на java.util.Map. Я где-то читал, что JAXB «не может работать с интерфейсами». Я не уверен, что это применимо в этом случае, но если так, мне будет хорошо с ним сопоставление с HashMap. Кроме того, это необязательно должен быть complexType, который сопоставляется с Map, это может быть элемент, если это то, что требуется.Можно ли использовать JAXB для сопоставления схемы с java.util.Map?

Я управляю своим поколением JAXB, используя файл .xjb, поэтому я ищу несколько <jaxb:bindings>, чтобы положить туда. Я попытался следующие, но это не работает:

<jaxb:bindings schemaLocation="myschema.xsd" node="/xs:schema"> 
    <jaxb:globalBindings> 
     <jaxb:serializable uid="1"/> 
    </jaxb:globalBindings> 
    <jaxb:schemaBindings> 
     <jaxb:package name="com.myschema.client.types"/> 
    </jaxb:schemaBindings> 
    <jaxb:bindings node="//xs:complexType[@name='MapType']"> 
      <jaxb:javaType name="java.util.HashMap" 
      parseMethod="com.myschema.common.MapConverter.parseObjectToMap" 
      printMethod="com.myschema.common.MapConverter.printMapToObject" /> 
    </jaxb:bindings> 
</jaxb:bindings> 

Edit: Я добавил более подробную информацию о выше связывания, что я уже пробовал. Он генерирует следующую ошибку во время компиляции схемы:

[jaxb] [ERROR] compiler was unable to honor this javaType customization. It is attached to a wrong place, or its inconsistent with other bindings. 

<jaxb:javaType> не будет работать, потому что он может быть использован только для mapping between XML Schema primitives and Java types. Поскольку я хочу сопоставить сложный тип и тип Java, я не могу использовать это.

+0

Ваш подход «.xjb» является правильным и должен работать. XJC просто игнорирует это, или это порождает неправильную вещь? – skaffman

+0

Используя вышеприведенный подход .xjb, я получаю следующую ошибку в компиляции jaxb: [jaxb] [ERROR] компилятор не смог выполнить эту настройку javaType. Он прикреплен к неправильному месту или несовместим с другими связями. – Zach

ответ

10

Ваш XJC-файл использует стандартную директиву javaType, которая, как мне кажется, ограничивается преобразованием значений String в типичный Java-тип и из него. Таким образом, он подходит только для преобразования простого содержимого элементов и атрибутов.

Инструмент XJC предоставляет расширенную версию javaType, которая теоретически должна иметь возможность обрабатывать более сложные структуры. К сожалению, это еще предстоит выполнить:

https://java.net/jira/browse/JAXB-209 (неразрешенный)

Например, будучи в состоянии отобразить тип схемы к HashMap может быть вероятно, требование для тех, кто использует Model Driven дизайн /реализация. AFAICS, сегодня это невозможно. Поэтому необходимо вручную отредактировать генерируемый код .

Похоже, вам не повезло.

+0

Я надеялся, что это не будет ответом, Я рад узнать, что я ничего не пропустил. – Zach

6

Вы смотрели на пример здесь (Customized отображение HashMap): http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html

Необходимо создать пользовательские XMLAdapter, я боюсь.

+1

Эй, это выглядит довольно близко к тому, что я хочу сделать! Единственное, я использую схему для генерации типов Java (как часть моего процесса сборки). Я не против писать адаптер, но я бы хотел, чтобы у вас не было предварительно реализованного класса, который генерирует схему (MyHashMapType и MyHashMapEntryType в связанном примере), поскольку это идет назад для меня. Это возможно? – Zach

+0

Я не думаю, что это строго необходимо, скорее всего, это просто расширенный пример. Я знаю, что мы делали это в прошлом с помощью схемы, связывающей файл настройки и адаптер. – maximdim

+0

Похоже, что JSON ... – duffymo