Проблема наследования JAXB - повреждение пространства имен - PullRequest
0 голосов
/ 09 марта 2012

Мы сталкиваемся с проблемой при сортировке объекта в XML с помощью JAXB.В нашем примере кода (https://github.com/fbe/JaxbIssueTracker, простой проект maven, test-case демонстрирует, что происходит не так), у нас есть три типа:

  • parent
  • hijacked
  • concrete

XSD можно найти здесь: github

Родительский тип абстрактный, бетон расширяет родительский, родительский ссылается наугнанный тип в последовательности.Из этих xsd-файлов JAVA-файлы генерируются JAXB (xjc) без каких-либо предупреждений или сообщений об ошибках.

При маршалинге конкретного типа JAXB генерирует следующий xml-вывод:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:concreteType xmlns:ns2="http://www.felixbecker.name/parent" xmlns="http://www.felixbecker.name/hijacked" xmlns:ns3="http://www.felixbecker.name/concrete">
    <ns2:hijacked>
        <value>foobar</value>
    </ns2:hijacked>
</ns3:concreteType>

Как вы можете видеть, угнанный тип неверно использует префикс ns2, который ссылается напространство имен родительского типа - но вместо этого ему следует использовать пространство имен по умолчанию, которое ссылается на захваченное пространство имен.

JAXB не может демонтировать этот сгенерированный xml, хотя он генерируется сам по себе с активированной проверкой схемы.

Что здесь не так?Не нарушена ли xml-схема?Или JAXB не может правильно обрабатывать наследование?

Удаление абстрактного атрибута из parent.xsd не оказало никакого влияния на возникшую проблему.

Любая помощь будет принята с благодарностью!: -)

Используемые версии (обе неработающие):

  • JAXB от JDK 1.6
  • JAXB-RI 2.2.5

С уважением,

fbe & ollinux

1 Ответ

0 голосов
/ 09 марта 2012

В вашем примере элемент hijacked фактически определен в родительской схеме и поэтому помещается в пространство имен "parent". Это означает, что пространства имен выделенного документа верны. Если jaxb может распаковать документ, который он сам выложил, то для меня это звучит как ошибка.

Чтобы получить элемент hijacked в правильном пространстве имен, вы можете переместить объявление элемента в схему hijacked и использовать

<element ref="hijacked:hijacked"/>

в родительской схеме.

...