2012-03-08 25 views
5

Come si invia più di un parametro nel corpo della richiesta in una richiesta POST?CXF JAXRS - Come caricare più di un parametro

@POST 
@Consumes("multipart/form-data") 
@Produces("application/json") 
public String addForm1(@FormParam("i1") Integer i1, @FormParam("i2") Integer i2); 

Sopra codice restituisce HTTP 415.

Sostituzione @FormParam con @Multipart risultati in Resource method has more than one parameter representing a request body errore, come illustrato di seguito.

SEVERE: Resource method service.rs.TestService.postData2 has more than one parameter representing a request body 
Exception in thread "main" org.apache.cxf.jaxrs.client.ClientWebApplicationException: Resource method service.rs.TestService.postData2 has more than one parameter representing a request body 
at org.apache.cxf.jaxrs.client.ClientProxyImpl.reportInvalidResourceMethod(ClientProxyImpl.java:546) 
at org.apache.cxf.jaxrs.client.ClientProxyImpl.getParametersInfo(ClientProxyImpl.java:214) 
at org.apache.cxf.jaxrs.client.ClientProxyImpl.invoke(ClientProxyImpl.java:138) 
at $Proxy20.postData2(Unknown Source) 
at service.TestServiceClient.main(TestServiceClient.java:82) 

Inoltre, che cosa devo fare per passare più tipi complessi come List<Map<String, String>>' or 'List<MyNestedCustomObject> in un metodo POST? Sono in grado di passare tale parametro utilizzando JAXB e annotandolo con @XmlJavaTypeAdapter, ma suppongo che non funzioni in caso di passaggio di più parametri? Sarei obbligato a definire i miei lettori del body reader &? Qualsiasi codice di esempio sarebbe utile.

Grazie

risposta

1

non si utilizza @FormParam con @Consumes; utilizzare solo @FormParam sui parametri e CXF calcolerà il resto.

Quando restituisco i risultati, restituisco un singolo oggetto con annotazione JAXB che contiene l'elenco delle cose. CXF utilizza internamente Jettison, che utilizza le annotazioni JAXB per guidare la conversione in JSON. Questo funziona abbastanza bene per me.

+1

Rimozione '@ Consumes' aiutato. Tuttavia, ho capito che ho bisogno di passare i parametri '@ Multipart' dato che i miei parametri non sono semplici. Ho bisogno di POST 2 parametri di questi tipi: 1. 'Elenco >' e 2. 'MyCustomObject'. Passare 1 parametro del genere funziona correttamente (ho definito 'XmlJavaTypeAdapter' per' Map 'e ho annotato' MyCustomObject' con '@ XmlRootElement'). Ma quando passo entrambi i parametri, getta 'ha più di un parametro che rappresenta l'errore di un corpo di richiesta. Ho provato 'multipart/mixed' e' multipart/related' per '@ Consumes' e contrassegnato params con' @ Multipart'. Apprezzo l'aiuto rapido. – domino

+0

@domino Hmm, stai uscendo dall'area che conosco abbastanza bene da consigliarti direttamente. http://cxf.apache.org/docs/jax-rs-multiparts.html dice di usare use '@ Multipart' _or_ una firma di' List '. Quale versione di CXF stai usando? –

+0

Dato che non ho a che fare con file/allegati in quanto tali, ho provato '@ Multipart'. Verificherà se 'Lista ' può essere di aiuto. Sto usando 2.5.2. Ci sono ** esempi su quella pagina che sembrano suggerire che dovrebbe essere diretto al POST di più parametri usando '@ Multipart'. Immagino che mi manchi qualcosa. – domino

3

Ho trovato un modo per farlo (vedi il codice sotto). Ma se conosci un modo migliore, che preferibilmente non usa il concetto di "allegati" e usa jaxrs: client direttamente invece di WebClient, per favore fammi sapere.

Servizio:

@POST 
@Path("/postdata3") 
@Consumes("multipart/mixed") 
@Produces("application/json") 
public String postData3(@Multipart(value = "testItem1", type = "application/json") TestItem t1, 
    @Multipart(value = "testItem2", type = "application/json") TestItem t2 
    ); 

Cliente:

WebClient client = WebClient.create("http://myserver/services/test/postdata3"); 
    client.type("multipart/mixed").accept("application/json"); 
    List<Attachment> atts = new LinkedList<Attachment>(); 
    atts.add(new Attachment("testItem1", "application/json", t1)); 
    atts.add(new Attachment("testItem2", "application/json", t2)); 
    javax.ws.rs.core.Response s = client.postCollection(atts, Attachment.class); 
    System.out.println(s.getStatus()); 
+0

Posso usare Multipart in config? In qualche ragione la mia interfaccia di servizio e la nostra classe di implementazione non potevano usare annotazioni Jax-rs/Cxf, quindi voglio pubblicare il servizio in modo config.Ma ho trovato il file di schema della risorsa del modello di servizio jaxrs-common.xsd che non supporta il parametro Multipart e il documento non accennato che in questa pagina http://cxf.apache.org/docs/jax-rs-multiparts.html, c'è un modo per usarlo in configurazione? Grazie mille! – Allen

Problemi correlati