2011-01-27 26 views
2

由於某些原因,元素的所有值都會被寫入兩次。 我的測試用例是很簡單的:JAXB 2.x:編組將元素值放入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: 在包文件夾中的文件jaxb.properties包含此行:

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

感謝您的任何提示。

回答

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

} 
+0

好的,昨天我通過使用XmlAccessType.FIELD應用了一種解決方法,它按預期工作。 – basZero 2011-01-28 07:42:03

+0

嗨Blaise,有沒有一個RSS訂閱我可以訂閱,以便知道什麼時候2.3.0獲得最終?每晚構建不是生產系統的候選人。 – basZero 2011-01-28 07:55:43

1

我想你的測試,它給了我正確的輸出:

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

它可能是JAXB2實現(在我的測試中,moxy在你的情況下與基於JDK1.6的JAXB2基於JAXB2)。