次のXMLのオブジェクトモデルを作成する必要があります。
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 Webサービスで使用されます。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に基づく最上位の要素名でtオブジェクトをシリアル化することです。例えば:
<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アノテーションを使用してクラス名に基づいた名前を付ける1つの回避策しかありません。ただし、トランザクションタイプに基づいて異なるクラスをインスタンス化する必要があります。また、見た目がかなり醜い2つの異なるクラスInvoiceLineAddとSalesOrderLineAddが必要になります。
これを処理するための解決策を教えてください。簡単なことを考えます。