2017-10-05 4 views
0

J'ai un objet que je veux rassembler mais le schéma n'a pas l'annotation @XmlRootElement.Suppression du préfixe ns2 pendant que JaxB rassemble un élément sans l'annotation @XmlRootElement

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "") 
public static class Foo 
{ 
    @XmlAttribute(name = "test1") 
    public final static String TEST_1 = "Foo"; 

    @XmlElement(name = "Element1", required = true) 
    protected String element1; 

    @XmlElement(name = "Element2", required = true) 
    protected String element2; 
} 

I regroupé l'objet en spécifiant un JaxBElement tout marshalling

QName qName = new QName("", "Foo"); 
jaxb2Marshaller.marshal(new JAXBElement(qName, Foo.class, fooObj), new StreamResult(baos)); 

Il en résulte le code XML suivant après marshalling

<Foo xmlns:ns2="http://Foo/bar" test1="Foo"> 
    <ns2:Element1>000000013</ns2:Element1> 
    <ns2:Element2>12345678900874357</ns2:Element2> 
</Foo> 

Pour ma usecase Je voudrais Marhsall cet objet sans le préfixe ns2 pour que le XML ressemble à

<Foo xmlns="http://Foo/bar" test1="Foo"> 
    <Element1>000000013</Element1> 
    <Element2>12345678900874357</Element2> 
</Foo> 

Comment puis-je marshall cet objet sans le préfixe?

Merci à l'avance.

Répondre

0

D'abord, vous créez l'élément Foo dans le mauvais espace de noms. En regardant votre sortie désirée, vous voulez également que l'élément Foo soit dans l'espace de noms http://Foo/bar. Pour résoudre ce problème, spécifiez cet espace de noms URI lorsque vous créez le QName, au lieu de passer une chaîne vide comme premier argument:

// Wrong 
QName qName = new QName("", "Foo"); 

// Right 
QName qName = new QName("http://Foo/bar", "Foo"); 

Pour se débarrasser du préfixe ns2 généré pour l'espace de noms, vous devez définir la préfixe d'espace de noms à une chaîne vide. Vous avez probablement un fichier package-info.java avec une annotation @XmlSchema. Il devrait ressembler à ceci:

@XmlSchema(namespace = "http://Foo/bar", 
      elementFormDefault = XmlNsForm.QUALIFIED, 
      xmlns = @XmlNs(prefix = "", namespaceURI = "http://Foo/bar")) 
package com.mycompany.mypackage; 

import javax.xml.bind.annotation.XmlNs; 
import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

Note: Réglage prefix = "" provoquera JAXB de générer un attribut xmlns sans nom préfixe généré tel que ns2 dans votre XML.

+0

Merci! J'ai été capable d'arriver à la même solution mais votre explication a aidé à comprendre pourquoi. –