J'ai un fichier qui est imprimé avec un espace de noms par défaut. Les éléments sont imprimés avec un préfixe ns2, j'ai besoin de le supprimer, comment il se trouve avec mon code:
<ns2:foo xmlns:ns2="http://namespace" />
comment je veux que ce soit:
<foo xmlns="http://namespace" />
voici comment je l'ai codé, ce qui, à mon avis, devrait suffire à faire disparaître le ns2:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:bar="http://namespace" targetNamespace="http://namespace"
elementFormDefault="qualified">
...
les informations de paquet générées se présentent comme ceci:
@javax.xml.bind.annotation.XmlSchema(namespace = "http://namespace",
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.foo.bar;
Je crée le fichier comme ceci:
JAXBContext jaxbContext = JAXBContext.newInstance(generatedClassesPackage);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(new JAXBElement<Foo>(new QName("http://namespace", "Foo"),
Foo.class, rootFoo), outputStream);
generatedClassesPackage est le package dans lequel se trouvent package-info.Java et les éléments.
L'objet Foo est défini et a des éléments comme celui-ci:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"group"
})
@XmlRootElement(name = "Foo")
public class Foo {
@XmlElement(name = "Group", required = true)
protected List<Group> group;
Est-ce quelque chose que j'ai raté? ou ai-je mal compris comment cela fonctionne?
Très probablement, la réponse contient plusieurs espaces-noms. Ceci utilisera la convention par défaut de création de préfixes d'espace de nom ns # et l'un d'eux devient le xmlns sans préfixe. Si vous souhaitez contrôler cela, vous pouvez procéder comme suit:
NamespacePrefixMapper mapper = new NamespacePrefixMapper() {
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
if ("http://namespace".equals(namespaceUri) && !requirePrefix)
return "";
return "ns";
}
};
marshaller.setProperty("com.Sun.xml.bind.namespacePrefixMapper", mapper);
marshaller.mashal....
Ceci définira toujours http://namespace
comme xmlns par défaut et utilisera ns # pour tous les autres espaces de noms lors du marshalling. Vous pouvez également leur donner des préfixes plus descriptifs si vous le souhaitez.
Lorsque vous ouvrez un nouveau package, il vous suffit de sélectionner créer les informations de package.
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.sitemaps.org/schemas/sitemap/0.9", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, xmlns = { @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.sitemaps.org/schemas/sitemap/0.9", prefix = "") })
Cela supprimera le préfixe ns2
Depuis JDK6u18, la technique NamespacePrefixMapper n'est plus utilisée.
Je résous ce problème en supprimant le fichier package-info.Java dans le package de classes jaxb et en recompilant l'application.
Pour Java 8:
Je chagnge le nom de préfixe de 'ns2' à 'fault'.
Premièrement , créez votre * DefaultNamespacePrefixMapper *.
import com.Sun.xml.bind.marshaller.NamespacePrefixMapper;
import Java.util.HashMap;
import Java.util.Map;
public class DefaultNamespacePrefixMapper extends NamespacePrefixMapper {
private static final String FAULT_PREFIX = "fault";
private Map<String, String> namespaceMap = new HashMap<>();
public DefaultNamespacePrefixMapper() {
this.namespaceMap.put(NAMESPACE, FAULT_PREFIX);
}
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
return namespaceMap.getOrDefault(namespaceUri, suggestion);
}
}
Secondy , ajoutez votre DefaultNamespacePrefixMapper à la propriété Marshaller.
@SuppressWarnings("unchecked")
private <T> void returnFault(T fault, SoapFault soapFault) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(fault.getClass());
QName name = new QName(NAMESPACE, fault.getClass().getSimpleName());
JAXBElement<T> element = new JAXBElement<>(name, (Class<T>) fault.getClass(), fault);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty("com.Sun.xml.bind.namespacePrefixMapper", new DefaultNamespacePrefixMapper());
marshaller.marshal(element, soapFault.addFaultDetail().getResult());
} catch (JAXBException e) {
log.error("Exception when marshalling SOAP fault.", e);
}
}
Troisièmement , ajoutez les dépendances suivantes dans gradle/maven.
compile 'com.Sun.xml.bind:jaxb-impl:2.2.11'
compile 'com.Sun.xml.bind:jaxb-core:2.2.11'