Подтвердить что ты не робот

Можно ли использовать 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, я не могу использовать это.

4b9b3361

Ответ 1

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

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

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

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

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