2015-10-26 65 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