Я генерирую XML из моих классов.Моя проблема в списке производных объектов.Я нашел возможность устанавливать xsi: type для каждого элемента в списке и нашел отдельную возможность установить тип объекта для имени тега.Но мне нужно объединить обе способности.
Подробности ниже.
Это мои java классы
@XmlRootElement(name="BusinessEntityRef")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BusinessEntityRef", propOrder = { "id" })
@XmlSeeAlso({
TradeRef.class,
TransactionRef.class,
})
public class BusinessEntityRef
{
@XmlAttribute(name = "ID", required=true)
private String id;
public String getId() { return id; }
public BusinessEntityRef setId(String id)
{ this.id = id; return this; }
}
@XmlRootElement(name="TransactionRef")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TransactionRef", propOrder = { })
public class TransactionRef extends BusinessEntityRef {
}
@XmlRootElement(name="TradeRef")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TradeRef", propOrder = { "version" })
public class TradeRef extends BusinessEntityRef {
@XmlAttribute(name = "Version", required=false)
private Integer version;
public Integer getVersion() { return version; }
public TradeRef setVersion(Integer version)
{ this.version = version; return this; }
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "References", propOrder = { })
public class References {
private ArrayList<BusinessEntityRef> elements = new ArrayList<>();
public void add(BusinessEntityRef businessEntityRef) {
elements.add(businessEntityRef);
}
}
@XmlRootElement(name="BusinessEntity")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BusinessEntity", propOrder = { "references" })
public class BusinessEntity
{
@XmlElement(name="References")
private References references;
}
Результат генерации XML для списка:
<References>
<elements xsi:type="rf:TradeRef" Version="1" ID="QR21-1"></elements>
<elements xsi:type="rf:TransactionRef" ID="QR31-1"></elements>
</References>
Я изменил класс References на extends из List.
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "References", propOrder = { })
public class References extends ArrayList<BusinessEntityRef> {
}
@XmlRootElement(name="BusinessEntity")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BusinessEntity", propOrder = { "references" })
public class BusinessEntity
{
@XmlElementWrapper(name="References")
@XmlElementRef
private References references;
}
И новый результат
<References>
<rf:TradeRef Version="1" ID="QR21-1"></rf:TradeRef>
<rf:TransactionRef ID="QR31-1"></rf:TransactionRef>
</References>
И я действительно хочу это
<References>
<rf:TradeRef xsi:type="rf:TradeRef" Version="1" ID="QR21-1"></rf:TradeRef>
<rf:TransactionRef xsi:type="rf:TransactionRef" ID="QR31-1"></rf:TransactionRef>
</References>