Создайте с помощью JAXB список с именем и xsi: type - PullRequest
0 голосов
/ 18 октября 2018

Я генерирую 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...