JAXB не отменяет сортировку xml любого элемента в JAXBElement - PullRequest
9 голосов
/ 25 февраля 2011

У меня есть вызов веб-службы. В моем ответе, когда я пытаюсь получить элемент xml any в JAXBElement, он выдает ошибку.

В схеме у меня есть:

<xs:complexType name="InputType">
    <xs:annotation></xs:annotation>
    <xs:sequence>           
        <xs:element name="Id" type="xs:string" />
        <xs:any namespace="##any" processContents="lax" minOccurs="0" />
    </xs:sequence>
</xs:complexType>

Код, который я использую:

Object obj = inputType.getAny();
Object o = ((JAXBElement)obj).getValue(); 

В этой строке выдается ошибка: org.apache.xerces.dom.ElementNSImpl incompatible with javax.xml.bind.JAXBElement ошибка в мыльном интерфейсе.

Почему он не скрыт в JAXBElement? Как мне заставить это работать?

Ответы [ 2 ]

9 голосов
/ 25 февраля 2011

Если для свойства указано следующее, содержимое будет отображаться как узлы DOM:

@XmlAnyElement

Если установлен флаг lax = true, тогда известные элементы будут преобразованы в объекты домена:

@XmlAnyElement(lax=true)

Для получения дополнительной информации о @XmlAnyElement см .:

<Ч />

ОБНОВЛЕНИЕ # 1

С помощью lax = true вы можете получить сочетание объектов домена и узлов DOM. Следующее из документов Java:

При истинном

Если true, когда элемент соответствует свойству помеченному XmlAnyElement известен JAXBContext (например, есть класс с XmlRootElement с тем же тегом имя или есть XmlElementDecl, который имеет одинаковое имя тега), unmarshaller будет нетерпеливо unmarshal этот элемент объекта JAXB, вместо того, чтобы разоблачить это в DOM. Кроме того, если элемент неизвестно, но у него есть известный xsi: type, маршаллер с нетерпением немаршал элемент JAXBElement, с неизвестное имя элемента и Значение JAXBElement установлено в экземпляр JAXB-сопоставления известный xsi: тип.

В результате после разборки собственность может стать неоднородной; он может иметь как DOM-узлы, так и некоторые JAXB объекты одновременно.

<Ч />

ОБНОВЛЕНИЕ № 2

Для окончательного решения проблемы:

  1. Поскольку это свойство может содержать узел DOM, ваш код должен учитывать эту возможность, выполняя некоторую проверку типов.
  2. Чтобы уменьшить количество полученных узлов DOM, вам необходимо связать возможные корневые элементы этих фрагментов с классами Java. Это делается путем аннотирования классов с помощью @XmlRootElement (name = "foo", namespace = "bar") или с помощью @XmlElementDecl.

Посмотрите в моем блоге пример:

1 голос
/ 25 февраля 2011

проверить ваш xml по вашей схеме. это должно быть первым, что нужно проверить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...