2015-10-26 64 views
0

我想解析這個XML到Java對象,一個包含EmailAdresses列表的Customer對象。JAXB Unmarshall到列表

<customer> 
<emailAddresses>[email protected]</emailAddresses> 
<emailAddresses>[email protected]</emailAddresses> 
</customer> 

經與列表中的一個問題,我得到的列表項(2),但爲EmailAddresses變量的值正確的號碼是空

Customer.java

@XmlRootElement(name = "customer") 
public class Customer 
{ 
    private List<EmailAddress> emailAddresses; 

    public Customer() 
    { 
     emailAddresses = new ArrayList<EmailAddress>(); 
    } 

    public List<EmailAddress> getEmailAddresses() 
    { 
     return emailAddresses; 
    } 

    public void setEmailAddresses(List<EmailAddress> emailAddresses) 
    { 
     this.emailAddresses = emailAddresses; 
    } 
} 

EmailAddress.java

public class EmailAddress 
{ 
    private String emailAddresses; 

    public String getEmailAddresses() 
    { 
     return emailAddresses; 
    } 

     public void setEmailAddresses(String emailAddresses) 
    { 
     this.emailAddresses = emailAddresses; 
    } 
} 

失敗的單元測試

@Test 
public void shouldDeserialiseCusomerXMLToObject() throws JAXBException 
{ 
    String xml = "<customer>" 
      + " <emailAddresses>[email protected]</emailAddresses>" 
      + " <emailAddresses>[email protected]</emailAddresses>" 
      + "</customer>"; 

    JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class); 
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 

    StringReader reader = new StringReader(xml); 
    Customer msg = (Customer) jaxbUnmarshaller.unmarshal(reader); 

    // This passes, I have 2 emailAddresses 
    assertEquals(2, msg.getEmailAddresses().size()); 

    // This fails, I have a null pointer instead of the email address 
    assertEquals("[email protected]", msg.getEmailAddresses().get(0).getEmailAddresses()); 
} 
+0

我試着按照下面添加幾個註釋,但沒有運氣。 – MikeJ

回答

3

EmailAddressemailAddresses欄默認是作爲子處理,期待XML是:

<customer> 
    <emailAddresses> 
     <emailAddresses>[email protected]</emailAddresses> 
    </emailAddresses> 
    <emailAddresses> 
     <emailAddresses>[email protected]</emailAddresses> 
    </emailAddresses> 
</customer> 

由於您的外部<emailAddresses>元素不包含內部<emailAddresses>元素,因此該字段永遠不會被分配。

你想要的EmailAddressemailAddresses場是(外)<emailAddresses>元素的值,所以你必須,通過指定@XmlValue註解告訴JAXB

@XmlValue 
public String getEmailAddresses() 
{ 
    return emailAddresses; 
} 

@XmlValue註解在與@XmlAttribute結合時特別有用,以支持如下的XML:

<Person sex="male" age="25">John Doe</Person> 

那麼類將然後是:

public class Person { 
    public enum Sex { 
     @XmlEnumValue("male") MALE, 
     @XmlEnumValue("female") FEMALE, 
    } 
    @XmlAttribute 
    private Sex sex; 
    @XmlAttribute 
    private int age; 
    @Value 
    private String name; 
} 
+0

感謝您的真實詳細解釋,非常感謝!現在工作很好。 – MikeJ

0

你有太多的電子郵件地址的水平。

如果您的電子郵件地址的列表改變爲一個字符串列表,像

@XmlRootElement(name = "customer") 
public class Customer 
{ 
    private List<String> emailAddresses; 

    public Customer() 
    { 
     emailAddresses = new ArrayList<String>(); 
    } 

    public List<String> getEmailAddresses() 
    { 
     return emailAddresses; 
    } 

    public void setEmailAddresses(List<String> emailAddresses) 
    { 
     this.emailAddresses = emailAddresses; 
    } 
} 
+0

我不能那樣做,因爲我還需要爲emailAddresses添加一些XML屬性(從代碼中省略) – MikeJ