IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

namespace et prefixe : PropertyException: name: com.sun.xml.internal.bind.namespacePrefixMapper [JAXB]


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 76
    Points : 80
    Points
    80
    Par défaut namespace et prefixe : PropertyException: name: com.sun.xml.internal.bind.namespacePrefixMapper
    Bonjour,

    L'exception que je rencontre est la suivante : javax.xml.bind.PropertyException: name: com.sun.xml.internal.bind.namespacePrefixMapper


    l'origine du souci: je souhaite générer un fichier xml avec une ligne d'entête ou je précise les préfixes et namespace, une ligne qui ressemble à ceci:


    <mon_prefixe:element-compose xmlns:mon_prefixe="http://toto.titi.com/truc/blabla" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://toto.titi.com/truc/blabla mon_xsd.xsd">
    donc j'ai écris dans le @XmlRootElement(name = "mon-element-root", namespace="http://toto.titi.com/truc/blabla") dans ma classe root, exemple:
    @XmlRootElement(name = "element-compose", namespace="http://toto.titi.com/truc/blabla")
    @XmlType(propOrder={"status" , "maListeDePers"}) //l'ordre des elements
    public class ElementCompose extends IdentifiableXmlType{....}

    dans ma classe ElementComposeAccess, la méthode marshal est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    public void marshal(final ElementCompose elementCompose, final OutputStream output)
        throws JAXBException {
            final JAXBContext ctx = JAXBContext.newInstance(ElementCompose.class,Personne.class);
            final Marshaller marshaller = ctx.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://toto.titi.com/truc/blabla mon_xsd.xsd");
     
        NamespacePrefixMapper mapper = new NamespacePrefixMapper() {
    		@Override
    		public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
    			if ("http://toto.titi.com/truc/blabla".equals(namespaceUri)) {
    				return "p";
    			}
    			return suggestion;   //retourne xsi pour "http://www.w3.org/2001/XMLSchema-instance", si on met rien elle retourne ns3 ou autre...
    		}
    	};
    	marshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper", mapper); 
     
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.marshal(elementCompose, output);
    }

    dans le pom.xml, j'utilise ces deux jar:
    <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2</version>
    <type>jar</type>
    <scope>compile</scope>
    </dependency>

    <dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.1.12</version>
    <type>jar</type>
    <scope>compile</scope>
    </dependency>

    donc avant de vouloir personnaliser le prefixe du namespace, je n'avais pas l'exception mais elle est apparue quand j'ai rajouté le , namespace="http://toto.titi.com/truc/blabla" dans @XmlRootElement(name = "mon-element-root") et impléménter NamespacePrefixMapper mapper = new NamespacePrefixMapper() {..;


    Merci

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 76
    Points : 80
    Points
    80
    Par défaut Solution : si possible ne pas utiliser le jaxb-impl
    En commentant dans mon pom.xml le jar jaxb-impl, l'exception a disparu et le fichier xml de sortie est généré correctement

    <!--
    <dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.1.12</version>
    <type>jar</type>
    <scope>compile</scope>
    </dependency>

    -->
    JAXB and Namespace Prefixes : http://blog.bdoughan.com/2011/11/jax...-prefixes.html en espérant que le lien ne sera pas cassé bientot



    Le problème reste si on se trouve obligé d'utiliser jaxb-impl, pour moi c'est bon je m'en sors sans (pour l'instant) mais je ne sais pas si j'en aurais besoin un jour ?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 76
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par OrigineDeLaVie Voir le message
    En commentant dans mon pom.xml le jar jaxb-impl, l'exception a disparu et le fichier xml de sortie est généré correctement



    JAXB and Namespace Prefixes : http://blog.bdoughan.com/2011/11/jax...-prefixes.html en espérant que le lien ne sera pas cassé bientot



    Le problème reste si on se trouve obligé d'utiliser jaxb-impl, pour moi c'est bon je m'en sors sans (pour l'instant) mais je ne sais pas si j'en aurais besoin un jour ?
    La solution n'est pas liée au fait de ne pas prendre le jar jaxb-impl, mais de faire l'import de l'interface NamespacePrefixMapper qui est cohérent avec la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    marshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper", mapper);
    si on prend l'implémentation fournie par le JDK (com.sun.xml.internal.bind.NamespacePrefixMapper alors pas besoin du jar, si on veut l'implémentation du jar jaxb-impl alors on doit bien vérifier que l'import qu'on a fait est bien celui du jar et non du JDK (internal) et aussi la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper);
    Sans le .internal qui étais au milieu plus haut.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 19/04/2011, 15h17
  2. Réponses: 0
    Dernier message: 31/01/2011, 11h51
  3. Réponses: 1
    Dernier message: 02/04/2010, 11h34
  4. Réponses: 0
    Dernier message: 15/10/2009, 16h58
  5. [JAXP] com.sun.xml.parser.ValidatingParser
    Par yolepro dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 05/11/2008, 15h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo