web-dev-qa-db-fra.com

Obtention de l'exception JAXB comme "Deux classes ont le même nom de type XML ..."

Obtenir l'exception JAXB comme "Deux classes ont le même nom de type XML ...",

Voici les détails de l'exception :

Exception dans le thread "principal" com.Sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 décompte des exceptions IllegalAnnotationExceptions deux classes ont le même nom de type XML "city". Utilisez @ XmlType.name et @XmlType .namespace pour leur attribuer des noms différents. ce problème est lié à l'emplacement suivant: à com.model.City à public com.model.City com.model.Address.getCurrentCity () à com.model.Address ce problème est lié à l'emplacement suivant: à 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 (Source inconnue) à com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet (Source inconnue) à com.Sun .xml.internal.bind.v2.runtime.JAXBContextImpl. (Source inconnue) sur com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl $ JAXBContextBuilder.build (Source inconnue) sur com.Sun.xml.internal. bind.v2.ContextFactory.createContext (Source inconnue) sur com.Sun.xml.internal.bind.v2.ContextFactory.createContext (Source inconnue) sur Sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) sur Sun.reflect.NativeMethodAccessorImpl. invoke (Unknown Source) sur Sun.reflect.DelegatingMethodAccessorImpl.invoke (Unknown Source) sur Java.lang.reflect.Method.invoke (Unknown Source) sur javax.xml.bind.ContextFinder.newInstance (Unknown Source) sur javax.xml. bind.ContextFinder.find (Source inconnue) à javax.xml.bind.JAXBContext.newInstance (Source inconnue) à javax.xml.bind.JAXBContext.newInstance (Source inconnue) à com.PojoToXSD.m ain (PojoToXSD.Java:17)

J'ai pris l'exemple comme:

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;
}

Une autre classe de ville dans le package "com.common".

package **com.common**;

public class City {

    private String pinCode;
}

Nous devons créer des XSD et faire le Marshalling et le démarshalling avec le code existant dans notre projet (comme dans l'exemple de code ci-dessus), le code n'a pas d'annotations comme "@ XmlRootElement/@ XmlType" et nous ne pouvons pas changer le code source.

Je voudrais savoir s'il existe une solution pour résoudre le problème ci-dessus ou d'autres façons de créer des XSD et de marshaling/unmarshalling (comme MOXy..etc)?

Ce serait formidable si je pouvais obtenir la solution de n'importe qui ... Mai merci d'avance.

Merci,

Satya.

19
Satya

Remarque: Je suis le EclipseLink JAXB (MOXy) chef de file et membre du groupe d'experts JAXB (JSR-222) .

Si vous pouvez annoter la classe

Si vous pouvez modifier la classe, vous pouvez simplement ajouter un @XmlType annotation à l'une des classes City pour modifier le nom du type de schéma XML correspondant.

package **com.common**;

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

    private String pinCode;
}

Si vous ne pouvez pas annoter la classe

MOXy propose une extension de document de mappage externe qui peut être utilisée pour appliquer des métadonnées JAXB à une classe qui ne peut pas être modifiée.

<?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>

Pour plus d'informations


MISE À JOUR

1) nous devons écrire le fichier de liaison pour une seule classe de ville ou nous devons écrire toutes les 2 autres classes (je veux dire l'adresse et une autre ville)?

Le document de mappage externe de MOXy peut être utilisé pour augmenter ou remplacer complètement (voir: http://blog.bdoughan.com/2011/09/mapping-objects-to-multiple-xml-schemas.html ) le métadonnées sur une classe. Si la seule modification que vous devez apporter concerne l'une des classes City, vous n'avez pas besoin d'inclure les autres.

2) Dans le fichier de liaison, vous n'aviez considéré que le nom de classe, pas obligé de prendre les propriétés définies dans City (je veux dire pinCode)?

MOXy comme toute implémentation JAXB applique un mappage par défaut à toutes les classes. Vous n'avez qu'à fournir des métadonnées pour l'endroit où vous souhaitez que le comportement de mappage diffère de celui par défaut.

3) Nous devons opter pour MOXy pour cela?

JAXB n'a pas de document de mappage externe standard. Celui que j'ai décrit est une extension MOXy. Si vous utilisez JAXB RI, vous pouvez vérifier l'intégration avec Annox.

25
bdoughan