由于某种原因,元素的所有值都被写入两次。 我的测试用例非常简单:
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;
}
}
然后我将文档编组到文件系统中:
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
感谢任何提示。
答案 0 :(得分:3)
这是一个已知的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 :(得分:1)
我尝试了你的测试,它为我提供了正确的输出:
<root>
<lastname>abc </lastname>
</root>
它可能是JAXB2实现(在你的情况下为moxy而在我的测试中为基于JDK1.6的JAXB2)。