1つの請求書または請求書のリストを含むXMLファイルを返す複数のURLをクエリする必要があります(どのURLがリストを返し、どのURLが単一の請求書のみを返すかはわかっています)。
単一の請求書の形式(簡略化):
<?xml version="1.0" encoding="UTF-8"?>
<invoice>
<invoice-id>1</invoice-id>
</invoice>
請求書のリストの形式:
<?xml version="1.0" encoding="UTF-8"?>
<invoices>
<invoice>
<invoice-id>1</invoice-id>
</invoice>
<invoice>
<invoice-id>2</invoice-id>
</invoice>
</invoices>
Jerseyは、最初のxmlフラグメントを自動的に処理し、それをJavaクラスに変換できます。
@XmlRootElement
public class Invoice {
@XmlElement(name="invoice-id")
Integer invoiceId;
}
これは、次のコードで実行されます。
GenericType<JAXBElement<Invoice>> invoiceType = new GenericType<JAXBElement<Invoice>>() {};
Invoice invoice = (Invoice) resource.path("invoice_simple.xml").accept(MediaType.APPLICATION_XML_TYPE).get(invoiceType).getValue();
上記は動作します。
ここで、次のようにInvoiceListオブジェクトが必要です。
@XmlRootElement
public class InvoiceList {
@XmlElementWrapper(name="invoices")
@XmlElement(name="invoice")
List<Invoice> invoices;
}
ここで問題が発生します。InvoiceList.invoicesは、次の場合でもnullのままです。
GenericType<JAXBElement<InvoiceList>> invoicesType = new GenericType<JAXBElement<InvoiceList>>() {};
InvoiceList invoices = (InvoiceList) resource.path("invoices_simple.xml").accept(MediaType.APPLICATION_XML_TYPE).get(invoicesType).getValue();
// now invoices.invoices is still null!
Jersey / JAXBがオブジェクトのリストを処理できることは知っていますが、一番上の要素にリストが含まれていると機能しないようです。
だから、私の質問は次のとおりです。請求書オブジェクトのリストで構成されるxmlファイルを解析するようにJerseyに指示するにはどうすればよいですか?