Можно ли использовать JAXB для сопоставления схемы с java.util.Map?
У меня есть существующая схема XML, которая содержит тип, который я хотел бы сопоставить с какой-либо Java-картой, используя JAXB. Мой процесс сборки принимает схему и создает beans. Я хотел бы настроить этот процесс, указав один из complexTypes на моей карте схемы на java.util.Map. Я где-то читал, что JAXB "не может работать с интерфейсами". Я не уверен, что это применимо в этом случае, но если так, мне будет хорошо с ним сопоставление с HashMap. Кроме того, это необязательно должен быть complexType, который сопоставляется с 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>
Изменить: Я добавил более подробную информацию о вышеупомянутой привязке, которую я уже пробовал. Он генерирует следующую ошибку при компиляции схемы:
[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>
не будет работать, потому что он может использоваться только для сопоставления между примитивами XML-схемы и типами Java. Поскольку я хочу сопоставить сложный тип и тип Java, я не могу использовать это.
Ответы
Ответ 1
В вашем XJC файле используется стандартная директива javaType
, которая, как мне кажется, ограничивается преобразованием значений String в типичный Java-тип и из него. Таким образом, он подходит только для преобразования простого содержимого элементов и атрибутов.
Инструмент XJC предоставляет расширенную версию javaType
, которая теоретически должна иметь возможность обрабатывать более сложные структуры. К сожалению, это еще не реализовано:
https://java.net/jira/browse/JAXB-209 (неразрешенный)
Например, возможность сопоставить тип схемы для HashMap может быть вероятное требование для тех, кто использует модельный дизайн/реализация. AFAICS, сегодня это невозможно. Поэтому необходимо вручную отредактировать сгенерированный код.
Похоже, вам не повезло.
Ответ 2
Вы смотрите на пример здесь (Индивидуальное сопоставление HashMap):
http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html
Мне нужно создать собственный XmlAdapter.