Что-то говорит мне, что я выполняю шоу ужасов Java с xsd для генерации класса через JAXB... Надеюсь, кто-то может сказать мне, что!
Мне предоставили несколько связанных XSD, и мне нужно иметь возможность взаимодействовать с API. Скажем, есть A.xsd и B.xsd. A.xsd определяет элемент body, который может по существу содержать список любого типа, включая B-объекты:
<xsd:element name="Body" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:anyAttribute namespace="##any"/>
</xsd:complexType>
</xsd:element>
Поэтому я генерирую классы для A.xsd, чей корневой элемент помечен следующим образом:
@XmlRootElement(name = "A", namespace = "http://www.example.com/a")
public class A {
И я создаю package-info.java
в том же пакете, чтобы иметь это пространство имен, чтобы я мог его маршалировать:
@XmlSchema(namespace = "http://www.example.com/a", elementFormDefault = XmlNsForm.QUALIFIED)
package com.mypackage;
Теперь я генерирую классы для B.xsd в один и тот же пакет. (Я переименовал A ObjectFactory
в нечто другое, потому что IntelliJ не добавляет завод).
(EDIT: я также создал их в разных пакетах, но затем я получаю проблемы с сортировкой, потому что для запроса xml нужны как A, так и B.)
(Суб-вопрос - так вы обычно это делаете?)
Итак, класс B теперь имеет:
@XmlRootElement(name = "B")
public class B {
С этим я могу теперь создать A и маршал его. Я не получаю неприятный ns2, когда я вставляю B в тело благодаря package-info.java
(a la Java: Marshalling Object - Удаление дополнительной аннотации ns2 в xml).
Ответное сообщение, которое я получаю от API, также дает мне A, который я могу отключить без проблемы. НО основной объект в теле, который должен быть B
, не получит unmarshalled - это объект Node, поэтому я попытался:
JAXBContext specialContext = JAXBContext.newInstance(B.class);
Object companyAppt = specialContext.createUnmarshaller().unmarshal((Node)reply.getBody().getAny().get(0));
Но я получаю это исключение:
javax.xml.bind.UnmarshalException: unexpected element (uri:"/some/uri/location", local:"B"). Expected elements are <{http://www.example.com/a}B>
Поэтому я думаю, что ответ кроется в том, что package-info.java
но я просто не знаю, как манипулировать им.
Заранее спасибо.
РЕДАКТИРОВАТЬ
Здесь xsd я работаю с:
"А" в моем примере = http://xmlgw.companieshouse.gov.uk/v1-0/schema/Egov_ch-v2-0.xsd
"B" в моем exmaple = http://xmlgw.companieshouse.gov.uk/v1-0/schema/CompanyDetails-v2-1.xsd
Другие зависимые xds: http://xmlgw.companieshouse.gov.uk/v1-0/schema/chbase-v2-1.xsd
Почему вы не создаете классы Jaxb с помощью xjc, где вы можете передать несколько xsds и использовать файл привязок, если есть конфликт.
xjc -d out A.xsd B.xsd
[com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
исключений [com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
, но неудобно не говорит мне, где! Следовательно, xjc по одному.