JAXB 2.x: Marshalling дважды помещает значение элемента в XML - PullRequest
2 голосов
/ 27 января 2011

По какой-то причине все значения элемента записываются дважды.Мой тестовый пример очень прост:

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;
    }


}

Затем я собираю документ в файловую систему в 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"));

И получается XML:

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

Для простоты я удалил файл package-info.java с определениями пространства имен.

Я использую реализацию org.eclipse.persistence.moxy 2.1.2: файл jaxb.properties в папке пакетасодержит эту строку:

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

Спасибо за любые подсказки.

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Это известная проблема MOXy, которая была исправлена ​​в потоке EclipseLink 2.3.0. Загрузить EclipseLink 2.3.0 можно здесь:

Обходной путь для EclipseLink 2.1.2 - использовать другой тип доступа или аннотировать соответствующее поле с помощью @XmlTransient:

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;
    }

}
1 голос
/ 27 января 2011

Я попробовал ваш тест, и он дает правильный вывод для меня:

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

Это может быть реализация JAXB2 (moxy в вашем случае против собственного JAXB2 на основе JDK1.6 для моего теста).

...