2014-02-05 57 views
2

我正在使用JAXB進行封送和取消封送對象。我有一個類字符串列表MyBean作爲字段和@XmlAttribute註釋。JAXB:類型爲unmarshelling字段的列表<String>和@XmlAttribute的問題

@XmlRootElement 
public class MyBean { 
    public MyBean() { 
     super(); 

    } 
    private List<String> actualValue; 

    @XmlAttribute 
    public List<String> getActualValue() { 
     if (actualValue == null) { 
      actualValue = new ArrayList<String>(); 
     } 
     return actualValue; 
    } 
    public void setActualValue(List<String> values) { 
     this.actualValue = values; 
    } 
} 

以下是封送和非封送MyBean的測試類。

public class Test { 

public static void main(String[] args) { 

    try { 
     // create object .... 
     MyBean myBean = new MyBean(); 
     List<String> values = new ArrayList<String>(); 
     values.add("Sanjv Singh Baghel"); 
     myBean.setActualValue(values); 



     // Marsheling 
     File file = new File("D://Temp//hello2.xml"); 
     JAXBContext jaxbContext2 = JAXBContext.newInstance(MyBean.class); 
     Marshaller jaxbMarshaller2 = jaxbContext2.createMarshaller(); 
     jaxbMarshaller2.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     jaxbMarshaller2.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); 
     jaxbMarshaller2.marshal(myBean, file); 

     // Un-Marsheling 
     JAXBContext jaxbContext = JAXBContext.newInstance(MyBean.class); 
     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 

     // printing actual value 
     MyBean myBean2 = (MyBean) jaxbUnmarshaller.unmarshal(file); 
     List<String> actualValue = myBean2.getActualValue(); 
     System.out.println(actualValue); 
    } catch (JAXBException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    } 

} 

輸出:

Before actualValue : ["sanjv singh baghel"] 
After actualValue : ["sanjv, singh, baghel"] 

奇怪的,我在這裏面臨的是,原來actualValue只有一個串空間和未mashelling,單一字符串轉換爲字符串列表後(分由空間)。

我想知道這是爲什麼發生/它有什麼問題。

對於,我找到兩個可能的解決方案。

  • 與@XmlElement
  • 列表actualValue更換@XmlAttribute; & Stirng需要映射到簡單類型的模式

回答

4

XML模式具有數據類型列表的概念。

<xs:attribute name="actualValue"> 
    <xs:simpleValue> 
     <xs:list itemType="xs:string"/> 
    <xs:simpleValue> 
</xs:attribute> 

這在XML中表示爲空格分隔值。

<foo actualValue="one two three"/> 

這就是你問JAXB通過將@XmlAttribute註釋上List<String>類型的屬性做。參見@XmlAttribute的javadoc中的「Example 3」。

如果用@XmlElement你會GE以下方面的代表取代@XmlAttribute

<foo> 
    <actualValue>one</actualValue> 
    <actualValue>two</actualValue> 
    <actualValue>three</actualValue> 
</foo>