2015-10-26 4 views
0

Я пытаюсь разобрать этот XML-объект Java, объект Customer, содержащий список адресов электронной почты.JAXB Unmarshall to List

<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

emailAddresses поля EmailAddress по умолчанию рассматривается как подэлемент, ожидая XML быть:

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

Поскольку ваш внешний элемент <emailAddresses> не содержит внутреннего элемента <emailAddresses>, поле никогда не назначается.

Вы хотите emailAddresses поля EmailAddress быть значением (внешнего) <emailAddresses> элемента, так что вы должны сказать JAXB, что, указав @XmlValue аннотацию:

@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

Я не могу это сделать, так как мне также нужно добавить некоторые атрибуты XML для emailAddresses (пропущено из кода) – MikeJ

Смежные вопросы