1

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に指示するにはどうすればよいですか?

4

1 に答える 1

2

最初の答えは

nillable = trueの上に置きます@XmlElement

@XmlElement(name = "invoice", nillable = true)
List<Invoice> invoices; 

そして、私はこのようにします。(既にラップされたコレクションをラップする必要はありません。)

@XmlRootElement
public class Invoices {

    public List<Invoice> getInvoices() {
        if (invoices == null) {
            invoices = new ArrayList<Invoice>();
        }
        return invoices;
    }

    @XmlElement(name = "invoice", nillable = true)
    private List<Invoice> invoices; 
}

いくつかの JAX-RS の例は次のようになります

@GET
@Path("/invoices")
public Invoices readInvoices() {
    // ...
}

@GET
@Path("/invoices/{invoice_id: \\d+}")
public Invoice readInvoice(@PathParam("invoice_id") final long invoiceId) {
    // ...
}
于 2012-12-16T15:45:34.267 に答える