3

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

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

感谢您的任何提示。

4

2 回答 2

3

这是已在 EclipseLink 2.3.0 流中修复的已知 MOXy 问题。可以在此处获得 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;
    }

}
于 2011-01-27T14:21:30.247 回答
1

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

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

它可能是 JAXB2 实现(在你的情况下是 moxy,而我的测试是基于原生 JDK1.6 的 JAXB2)。

于 2011-01-27T14:25:22.047 回答