Подтвердить что ты не робот

Получение исключения JAXB типа "Два класса имеют одно и то же имя типа XML..."

Получение исключения JAXB типа "Два класса имеют одинаковое имя типа XML...",

Вот сведения об исключении:

Исключение в потоке "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions Два класса имеют один и тот же XML введите название "город". Используйте @XmlType.name и @XmlType.namespace, чтобы назначить разные имена им. эта проблема связана с следующим месторасположение: at com.model.City at public com.model.City com.model.Address.getCurrentCity() в com.model.Address this проблема связана со следующим местоположением: на com.common.City       at public com.common.City com.model.Address.getPreviousCity() at com.model.Address

в com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException $Builder.check(Неизвестно Источник) в com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(Неизвестно Источник) в com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl(Неизвестно. Источник) в com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl $JAXBContextBuilder.build(Неизвестно Источник) в com.sun.xml.internal.bind.v2.ContextFactory.createContext(Неизвестно Источник) в com.sun.xml.internal.bind.v2.ContextFactory.createContext(Неизвестно Источник) на sun.reflect.NativeMethodAccessorImpl.invoke0 (Родной Метод) на sun.reflect.NativeMethodAccessorImpl.invoke(Неизвестно Источник) на sun.reflect.DelegatingMethodAccessorImpl.invoke(Неизвестно Источник) в java.lang.reflect.Method.invoke(Неизвестный источник) в javax.xml.bind.ContextFinder.newInstance(Неизвестный источник) в javax.xml.bind.ContextFinder.find(Неизвестный источник) в javax.xml.bind.JAXBContext.newInstance(Неизвестный источник) в javax.xml.bind.JAXBContext.newInstance(Неизвестный источник) в com.PojoToXSD.main(PojoToXSD.java:17)

Я взял пример:

package **com.model**; ---->this package contains 'Address' class and 'City' class

public class Address {

    private String areaName;
    private City currentCity;
    private com.common.City previousCity;
}

package com.model;

public class City {

    private String cityName;
}

Еще один класс города в пакете com.common.

package **com.common**;

public class City {

    private String pinCode;
}

Нам нужно создать XSD и сделать Marshalling и unmarshalling с существующим кодом в нашем проекте (например, как приведенный выше примерный код), код не содержит никаких аннотаций, таких как "@XmlRootElement/@XmlType", и мы не можем для изменения исходного кода.

Я хотел бы знать, есть ли какое-либо решение, чтобы устранить вышеупомянутую проблему или какие-либо другие способы создания XSD и маршалинга /unmarshalling (например, MOXy..etc)?

Было бы здорово, если бы я смог получить решение от любого... Может заранее спасибо.

Спасибо,

Satya.

4b9b3361

Ответ 1

Примечание. Я EclipseLink JAXB (MOXy) и член группы JAXB (JSR-222).

Если вы можете аннотировать класс

Если вы можете изменить класс, вы можете просто добавить аннотацию @XmlType к одному из классов City, чтобы изменить имя типа соответствующей схемы XML.

package **com.common**;

@XmlType(name="city2")
public class City {

    private String pinCode;
}

Если вы не можете аннотировать класс

MOXy предлагает расширение внешнего документа сопоставления, которое может использоваться для применения метаданных JAXB к классу, который нельзя изменить.

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="**com.common**">
    <java-types>
        <java-type name="City">
            <xml-type name="city2"/>
        </java-type>
    </java-types>
</xml-bindings>

Дополнительная информация


UPDATE

1) нам нужно написать файл привязки только для одного класса City или требуется написать все остальные 2 класса (я имею в виду адрес и другой город)?

MOXy внешний документ сопоставления может использоваться для дополнения или полной замены (см. http://blog.bdoughan.com/2011/09/mapping-objects-to-multiple-xml-schemas.html) метаданные в классе. Если единственное изменение, которое вам нужно сделать, это один из классов City, тогда вам не нужно включать других.

2) В файле привязки вы рассматривали только имя класса, не требуемое для взять свойства, определенные в City (я имею в виду pinCode)?

MOXy, как и любая реализация JAXB, применяет сопоставление по умолчанию для всех классов. Вам нужно всего лишь предоставить метаданные, в которых вы хотите, чтобы поведение отображения отличалось от стандартного.

3) Нам нужно выбрать MOXy для этого?

JAXB не имеет стандартного документа внешнего сопоставления. Тот, который я описал, является расширением MOXy. Если вы используете JAXB RI, вы можете проверить интеграцию с Annox.