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:
Citation:
<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:
Citation:
@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:
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:
Citation:
<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
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
Citation:
<!--
<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 ?