Я должен создать объектную модель для следующих XMLs:JAXB имя элемента на основе свойства объекта
XML образца 1:
<InvoiceAdd>
<TxnDate>2009-01-21</TxnDate>
<RefNumber>1</RefNumber>
<InvoiceLineAdd>
</InvoiceLineAdd>
</InvoiceAdd>
XML Пример 2:
<SalesOrderAdd>
<TxnDate>2009-01-21</TxnDate>
<RefNumber>1</RefNumber>
<SalesOrderLineAdd>
</SalesOrderLineAdd>
</SalesOrderAdd>
Выходной сигнал XML будет основываться на одном строковом параметре или перечислении. Строка txnType = "Счет-фактура"; (или «SalesOrder»);
Я хотел бы использовать один класс TransactionAdd:
@XmlRootElement
public class TransactionAdd {
public String txnDate;
public String refNumber;
private String txnType;
...
public List<LineAdd> lines;
}
вместо использования подклассы или что-нибудь еще. Код, который создает экземпляр TransactionAdd, одинаковый для обоих типов транзакций, он отличается только от типа.
Этот XML используется довольно известным продуктом QuickBooks и используется веб-службой QuickBooks, поэтому я не могу изменить XML, но я хочу упростить установку имени элемента на основе свойства (txnType).
Я хотел бы рассмотреть что-то вроде метода определения имени целевого элемента:
@XmlRootElement
public class TransactionAdd {
public String txnDate;
public String refNumber;
private String txnType;
...
public List<LineAdd> lines;
public String getElementName() {
return txnType + "Add";
}
}
Различные операции будут создаваться с использованием следующего кода:
t = new TransactionAdd();
t.txnDate = "2010-12-15";
t.refNumber = "123";
t.txnType = "Invoice";
Цель состоит в том, чтобы сериализовать т объект с верхней имя элемента на основе txnType. Например:
<InvoiceAdd>
<TxnDate>2009-01-21</TxnDate>
<RefNumber>1</RefNumber>
</InvoiceAdd>
В случае t.txnType = «SalesOrder» результат должен быть
<SalesOrderAdd>
<TxnDate>2009-01-21</TxnDate>
<RefNumber>1</RefNumber>
</SalesOrderAdd>
На данный момент я вижу только один обходной путь с подклассами InvoiceAdd и SalesOrderAdd и используя @XmlElementRef аннотацию, чтобы иметь имя, основанное на имени класса. Но ему нужно будет создавать экземпляры разных классов на основе типа транзакции, а также иметь два других класса InvoiceLineAdd и SalesOrderLineAdd, которые выглядят довольно уродливо.
Пожалуйста, предложите мне какое-либо решение для этого. Я бы подумал о чем-то простом.
Большое спасибо! Похоже, он делает это сейчас. Я проверю свой проект и верну свои результаты! – Vladimir