Frage

Aus irgendeinem Grund werden alle Werte eines Elements zweimal geschrieben. Mein Testfall ist sehr einfach:

package test;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name="root")
public class TestBean {

    private String name = null;

    @XmlElement(name="lastname")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}

Dann bin ich das Dokument in das Dateisystem in ein XML:

    TestBean object = new TestBean();
    object.setName("abc ");
    Class<?> clazz = object.getClass();
    JAXBContext context = JAXBContext.newInstance(clazz);
    Marshaller m = context.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
    m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
    m.marshal(object, new File("test.xml"));

Und das resultierende XML ist:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <lastname>abc abc </lastname>
</root>

Der Einfachheit halber habe ich die Paketinfo.java-Datei mit den Namespace-Definitionen entfernt.

Die von mir verwendete Implementierung ist org.

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Danke für irgendwelche Hinweise.

War es hilfreich?

Lösung

Dies ist ein bekanntes Moxy -Problem, das im EclipSelink 2.3.0 -Stream festgelegt wurde. Ein EclipSelink 2.3.0 Download kann hier erhalten werden:

Die Problemumgehung für EclipSelink 2.1.2 besteht darin, einen anderen Zugriffstyp zu verwenden oder das entsprechende Feld mit @xmltransient zu kommentieren:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name="root")
public class TestBean {

    @XmlTransient
    private String name = null;

    @XmlElement(name="lastname")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Andere Tipps

Ich habe Ihren Test ausprobiert und es gibt mir die richtige Ausgabe:

<root>
    <lastname>abc </lastname>
</root>

Es könnte die JAXB2 -Implementierung sein (Moxy in Ihrem Fall gegen native JDK1.6 -basierte JAXB2 für meinen Test).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top