Ответ 1
Я приведу из самое официальное неофициальное руководство по JAXB в сети.
Если схемы содержат похожие типы элементов/типов, они могут результат: "Два объявления вызывают столкновение в ObjectFactory класс". Точнее, для каждого из всех типов и многих элементы (точно, какие элементы получают factory, а что не бит сложно объяснить), XJC производит один метод в классе ObjectFactory в том же пакете. Класс ObjectFactory создается для каждого пакет, в который XJC генерирует некоторые файлы. Имя метода полученных из имен элементов XML/типа, и сообщается об ошибке, если два элементы/типы пытаются создать одно и то же имя метода.
Тем не менее, у вас есть два варианта.
Во-первых, нужно определить внешний XML-привязку, подобный этому
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="1.0">
<jaxb:bindings schemaLocation="Core.xsd">
<jaxb:bindings node="//xs:element[@name='BioSampleSet']/xs:complexType">
<jaxb:factoryMethod name="TypeBioSampleSet"/>
</jaxb:bindings>
<jaxb:bindings node="//xs:element[@name='TargetBioSampleSet']/xs:complexType">
<jaxb:factoryMethod name="TypeTargetBioSampleSet"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
В сгенерированном классе ObjectFactory
это создаст два метода под названием createTypeBioSampleSet
и createTypeTargetBioSampleSet
(JAXB добавит имя, которое вы указываете к слову create
), которое можно использовать для создания BioSampleSet
и TargetBioSampleSet
объектов.
(Нет необходимости определять привязку для обоих типов.)
Я не совсем уверен, почему JAXB отказывается генерировать классы из данной схемы, но когда я указал только одну привязку (например, для BioSampleSet
), другой тип factory был назван как createTypeProjectProjectTypeSubmissionWhateverThisAndThatTargetTargetSampleBioCatDogWoofTypeIDoNotKnowWhatElse
, поэтому Я думаю, JAXB задохнулся от этого длинного идентификатора метода, потому что ему как-то удалось создать тот же самый для обоих типов. Я думаю, что это некоторые детали реализации в JAXB.
Другое решение - создать базовый тип для BioSampleSet
и использовать его в обоих местах, таких как
<xs:element name="ProjectTypeSubmission">
...
<xs:element name="Target">
...
<xs:element name="BioSampleSet" type="typeBioSampleSet" minOccurs="0" maxOccurs="1"/>
...
</xs:element>
...
<xs:element name="TargetBioSampleSet" type="typeBioSampleSet"/>
...
<xs:element/>
...
<xs:complexType name="typeBioSampleSet">
<xs:sequence>
<xs:element name="ID" maxOccurs="unbounded" type="xs:token"></xs:element>
</xs:sequence>
</xs:complexType>
Лучшим решением было бы удалить все анонимные объявления типа из вашей схемы. Если вы можете это сделать, сделайте это, потому что эта схема выглядит как беспорядок (по крайней мере для меня).