2014-04-08 7 views
5

Hat es jemand jemals geschafft, unbenutzte Namespaces während des Marshalls eines Objekts mit JAXB zu entfernen? Hier ist eine Verknüpfung des angeforderten Features: https://java.net/jira/browse/JAXB-103 (siehe Beschreibung)Wie verhindert man, dass JAXB beim Marshalling unbenutzte Namespaces schreibt

Gibt es eine Eigenschaft für die Konfiguration von JAXB? Wurde dies in MOXy behoben?

Ich durchquere gerade das Objekt, das gemarshallt werden muss und extrahiere alle Klassen, die in Class [] classesToBeBound gebunden werden müssen. Dann erstelle ich einen neuen JAXBContext.newInstance (classesToBeBound)

Die nicht verwendeten Namespaces sind jetzt nicht in der XML enthalten.

Ich weiß, dass XML-Validierung auch mit den nicht verwendeten Namespaces gültig ist, aber für mich ist dies etwas, das ein Framework behandeln sollte.

Der folgende Link https://blogs.oracle.com/enterprisetechtips/entry/customizing_jaxb erwähnt verschiedene feste (irgendwo in der Mitte des Textes), aber beim Versuch, die Lösung in diesen Links zu finden, ist entweder der Link kaputt oder niemand hat es wirklich gelöst.

Kommentare sind willkommen.

(EDIT) Klartext:

GEGEBEN

a new instance of JAXBContext and add 2 classes with each a separate namespace. 

WENN

marshalling a class that has these 2 classes as a property but only 1 of them is not null 

DANN

I expect only the namespace of the property that is not null to be visible in the XML. 

aber die tatsächliche ist

that both namespaces are in the xml. 

Also meine Frage war, wie kann ich JAXB entfernen oder sagen, nicht die nicht verwendeten Namespaces zu schreiben?

Um es in Java-Code zu setzen:

GEGEBEN
public class Foo{ 
    private Bar bar; //namespace something2 
    private User user; //namespace user 
} 

WENN

JAXBContext c = JAXBContext.newInstance(Foo.class, Bar.class, User.class); 
... 
Foo foo = new Foo(); 
foo.setBar(null); 
foo.setUser(new User("Bob")); 
marshaller.umarshal(foo); 

dann erwarte ich die xml

<foo xmlns="something1" xmlns:user="user"> 
    <user:name>Bob</user:name> 
</foo> 

aber die tatsächliche ist (Anmerkung sein der namespace something2)

<foo xmlns="something1" xmlns:user="user" xmlns:bar="something2"> 
    <user:name>Bob</user:name> 
</foo> 

Natürlich ist dies ein vereinfachtes Beispiel und unsere Spezifikation eines Typs hat ungefähr 30 verschiedene Namespaces.

+0

Ich bin mir nicht sicher, ob ich Ihr Problem richtig verstehe. Möchten Sie alle nullwertigen Attribute aus dem resultierenden XML entfernen? Und das ist nicht ein Duplikat von http://stackoverflow.com/questions/11215485/jax-ws-to-remove-empty-tags-from-request-xml – Ota

Antwort

0

Ja, sie könnten weggelassen werden. Ich bin mir nicht sicher, ob ich das Problem richtig verstanden habe. Aber es gibt kein Problem, ein Objekt ohne Namespaces zu marshallen.

+0

Die erste Frage mit mehr Informationen aktualisiert. Können Sie angeben, WIE ich die nicht verwendeten Namespaces weglassen kann? Ob es sinnvoll ist, sie zu entfernen, ist eine andere Debatte, da ich weiß, dass sie syntaktisch korrekt ist, dass sie im XML enthalten sind ;-) – user2966436

+1

Können Sie die Anmerkungen zu Foo-, Bar- und User-Klassen posten? BTW, du meinst, Marshalling nicht entpacken, oder? – rossa

0

Dies ist möglicherweise nicht möglich, da beim Marshalling dieser Objekthierarchie zum Zeitpunkt der Erstellung des Root-Tags Informationen darüber, welche Objekte null v/s nicht null sind, möglicherweise nicht verfügbar sind.Jeder Versuch, diese Information im Voraus zu erhalten, kann auch mit Nebenwirkungen verbunden sein, wenn entsprechende Zugriffsmethoden aufgerufen werden. Daher wird JAXB statisch Informationen aus JAXBContext verwenden, um diese Informationen zu füllen.