繁体   English   中英

JAXB 2.x:编组将元素值两次放入XML

[英]JAXB 2.x : Marshalling puts element value twice into the XML

由于某种原因,一个元素的所有值都会被写入两次。 我的测试用例非常简单:

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:package文件夹中的jaxb.properties文件包含以下行:

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

感谢您的任何提示。

这是一个已知的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;
    }

}

我尝试了您的测试,它为我提供了正确的输出:

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

它可能是JAXB2的实现(对于我的测试,您的情况相对于基于本机JDK1.6的JAXB2而言是健壮的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM