【问题标题】:JAXB 2.x : Marshalling puts element value twice into the XMLJAXB 2.x:编组将元素值两次放入 XML
【发布时间】:2011-01-27 14:03:27
【问题描述】:

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

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

感谢您的任何提示。

【问题讨论】:

    标签: java jaxb marshalling eclipselink moxy


    【解决方案1】:

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

    【讨论】:

    • 好的,昨天我使用 XmlAccessType.FIELD 应用了一个解决方法,它按预期工作。
    • 嗨,Blaise,有没有我可以订阅的 RSS 提要,以便了解 2.3.0 何时成为最终版本?每晚构建不适合生产系统。
    • 刚刚使用 Eclipse Link 2.4.1 进行了测试,只有 string1 和 string 被编组...我认为这在 2.1.2 之后已经修复?
    • @basZero - 你能提供更多关于你所看到的细节吗?
    • 我将写一个新问题,因为它与我当前的演示代码略有不同。
    【解决方案2】:

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多