2014-10-14 2 views
1

Я сгенерировал несколько классов из нескольких файлов XML используя JAXB xjc tool.Сгенерированные классы JAXB, конфликтующие друг с другом

Эти XML-файлы имеют имена общие теги, что предполагает, что, когда я создал классы Java я имел несколько классов с тем же именем. Я поместил их в разные пакеты и впоследствии переименовал их.

Но я до сих пор есть эта ошибка:

The element name {}Document has more than one mapping. this problem is related to the following location: at public javax.xml.bind.JAXBElement com.xxx.generatedByJaxb.bal.ObjectFactory.createDocument(com.xxx.generatedByJaxb.bal.DocumentTypeBal) at com.xxx.generatedByJaxb.bal.ObjectFactory this problem is related to the following location: at public javax.xml.bind.JAXBElement com.xxx.generatedByJaxb.addr.ObjectFactory.createDocument(com.xxx.generatedByJaxb.addr.DocumentTypeAddr) at com.xxx.generatedByJaxb.addr.ObjectFactory

... повторялось много раз в консоли.


EDIT

Когда я первый столкнулся с проблемой конфликта я переименованный конфликтующие классы, так, например:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "DocumentType", propOrder = { "addressPage" }) 
public class DocumentType { 

Если бы были изменены:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "DocumentTypeAddr", propOrder = { "addressPage" }) 
public class DocumentTypeAddr { 

Я отредактировал классы, они известны без каких-либо изменений вручную. Вот ошибка, которую у меня есть:

Два класса имеют одно и то же имя типа XML «DocumentType». Используйте @ XmlType.name и @ XmlType.namespace, чтобы назначать им разные имена. эта проблема связана со следующим адресом: на com.xxx.generatedByJaxb.addr.DocumentType на общественном com.xxx.generatedByJaxb.addr.DocumentType com.xxx.generatedByJaxb.addr.ObjectFactory.createDocumentType() на ком. xxx.generatedByJaxb.addr.ObjectFactory Эта проблема связана со следующим адресом: at com.xxx.generatedByJaxb.bal.DocumentType at public com.xxx.generatedByJaxb.bal.DocumentType com.xxx.generatedByJaxb.bal.ObjectFactory. createDocumentType() at com.xxx.generatedByJaxb.bal.ObjectFactory Название элемента {} Документ имеет более одного отображения. Эта проблема связана со следующим адресом: at public javax.xml.bind.JAXBElement com.xxx.generatedByJaxb.bal.ObjectFactory.createDocument (com.xxx.generatedByJaxb.bal.DocumentType) at com.xxx.generatedByJaxb. bal.ObjectFactory Эта проблема связана со следующим адресом: at public javax.xml.bind.JAXBElement com.xxx.generatedByJaxb.addr.ObjectFactory.createDocument (com.xxx.generatedByJaxb.addr.DocumentType) at com.xxx .generatedByJaxb.addr.ObjectFactory

Вот пример XSD-файла (между 7 XSD файлов, которые я генерировать классы от):

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified"> 
    <xs:element name="Document" type="DocumentType"/> 
    <xs:complexType name="DateType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute type="xs:string" name="Type"/> 
     <xs:attribute type="xs:int" name="Date"/> 
     <xs:attribute type="xs:byte" name="HH"/> 
     <xs:attribute type="xs:byte" name="MM"/> 
     <xs:attribute type="xs:byte" name="SS"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="ChargeType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute type="xs:short" name="Id" use="optional"/> 
     <xs:attribute type="xs:float" name="Amount" use="optional"/> 
     <xs:attribute type="xs:string" name="CurrCode" use="optional"/> 
     <xs:attribute type="xs:byte" name="Type" use="optional"/> 
     <xs:attribute type="xs:string" name="PT" use="optional"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="BalancePageType"> 
    <xs:sequence> 
     <xs:element type="DateType" name="Date"/> 
     <xs:element type="ChargeType" name="Charge" maxOccurs="unbounded" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="DocumentType"> 
    <xs:sequence> 
     <xs:element type="BalancePageType" name="BalancePage"/> 
    </xs:sequence> 
    <xs:attribute type="xs:string" name="Sender"/> 
    <xs:attribute type="xs:string" name="Id"/> 
    <xs:attribute type="xs:string" name="BAId"/> 
    </xs:complexType> 
</xs:schema> 
+0

Пожалуйста, разместите пример своих схем и конфликтующих классов. – lexicore

+0

Существует много классов в конфликте – Siho

+0

И файлы XML конфиденциальны извините – Siho

ответ

1

Это не полный ответ (что невозможно в данных условиях), но оно предназначено для предоставления первых указателей.

Трудно вам помочь, если вы не можете показать какой-либо код.Если ваши оригинальные материалы являются конфиденциальными, попробуйте сделать анонимные образцы.

Так вот некоторые очень общие советы:

  • Ваша цель состоит в том, чтобы устранить дублирующие классов.
  • Скомпилируйте свои схемы one namespace per package, чтобы у вас не было повторяющихся классов.
  • Возможно, вы столкнулись с a chameleon schemas. Это очень плохой дизайн для JAXB, не могу помочь.
  • Если вы скомпилируете свои схемы с помощью XJC, не копируйте и не переименуйте классы вручную. Узнать how to use binding files.

Я думаю, что лучший способ для вас - собрать небольшой неконфиденциальный пример, который по-прежнему является показательным и имеет отношение к вашему прецеденту.

+0

Я уже вручную переименовал некоторые классы: см. Мое редактирование. Может ли это вызвать проблему? Все ли отменят все действия переименования? – Siho

+0

Извините, я не могу дать совет, не зная всей картины. Обычно переименование или изменение сгенерированного кода в любом случае не является хорошей идеей, так как ваши изменения будут аннулированы для следующего поколения. Но это НЕ совет, чтобы вернуть что-либо. – lexicore

+0

Я отредактировал мой вопрос – Siho

Смежные вопросы