JAXB автоматически сопоставляет поля или свойства. Если @XmlAccessorType
отсутствует, то по умолчанию используется значение XmlAccessType.PUBLIC_MEMBER
, что означает ( см. Javado c)
Каждая опубликованная пара c геттер / установщик и каждое публикуемое поле c будет автоматически привязано к XML, если оно не аннотировано XmlTransient.
В вашем случае по умолчанию все public
получатель / установщик отображаются, даже если аннотации нет подарок. Поля не отображаются, потому что они private
, если явно не указано иное.
Итак, существует конфликт с stepList
и scenarioList
, которые отображаются два раза: public
getter / setter, потому что @XmlAccessorType
отсутствует, а поле, потому что оно аннотировано.
И обратите внимание, что в вашем классе Features у вас будет элемент <feature>
(аннотированное частное поле featureList) и <featureList>
element (publi c getter для featureList), оба с одинаковым содержимым.
Вы можете избежать этого, добавив аннотацию @XmlTransient
в getter свойства, чтобы избежать автоматического сопоставления c. Но я бы предложил выбрать отображение полей или свойств и соответственно указать @XmlAccessorType.
Например, ваш сценарий. java может быть сопоставлен с:
// Non static, non transient fields will be automatically be mapped unless annotated with XmlTransient.
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "scenario")
public class Scenario {
@XmlElementWrapper(name = "steps")
@XmlElement(name= "step")
private ArrayList<Step> stepList = null;
@XmlAttribute
private int id;
// Mapping a field to an element is the default, so this annotation is not strictly
// needed, unless you want to change the default element name
@XmlElement
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList<Step> getStepList() {
return stepList;
}
public void setStepList(ArrayList<Step> stepList) {
this.stepList = stepList;
}
}