2012-03-08 9 views
5

Jak wysłać więcej niż jeden parametr w treści żądania w żądaniu POST?CXF JAXRS - jak POST więcej niż jeden parametr

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

Powyższy kod zwraca HTTP 415.

Wymiana @FormParam z @Multipart skutkuje Resource method has more than one parameter representing a request body błędu, jak pokazano poniżej.

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) 

Ponadto, co muszę zrobić, aby przekazać wiele złożonych typów, takich jak List<Map<String, String>>' or 'List<MyNestedCustomObject> w metodzie POST? Jestem w stanie przekazać taki parametr za pomocą JAXB i opisać go za pomocą @XmlJavaTypeAdapter, ale myślę, że to nie działa w przypadku przekazywania wielu parametrów? Czy zostałbym zobowiązany do zdefiniowania własnych pisarzy treści wiadomości: &? Przydałby się przykładowy kod.

Dzięki

Odpowiedz

1

Nie używać @FormParam z @Consumes; używaj tylko @FormParam dla parametrów, a CXF wymyśli resztę.

Po przekazaniu wyników zwracam pojedynczy obiekt z adnotacjami JAXB, który zawiera listę rzeczy. CXF używa wewnętrznie Jettison, która wykorzystuje te adnotacje JAXB do kierowania konwersją do JSON. Działa to całkiem dobrze dla mnie.

+1

Usuwanie '@ Consumes' pomogło. Jednak zdałem sobie sprawę, że muszę przekazać parametry '@ Multipart', ponieważ moje parametry nie są proste. Muszę POST 2 params tych typów: 1. Lista > 'i 2.' MyCustomObject'. Przekazanie 1 takiego parametru działa dobrze (zdefiniowałem 'XmlJavaTypeAdapter' dla' Map 'i opisałem' MyCustomObject' za pomocą '@ XmlRootElement'). Ale kiedy przekazuję oba parametry, to wyrzuca 'ma więcej niż jeden parametr reprezentujący błąd żądania. Próbowałem 'multipart/mixed' &' multipart/related' dla '@ Consumes' i oznaczono parametrami' @ Multipart'. Doceń szybką pomoc. – domino

+0

@domino Hmm, wychodzisz poza obszar, który znam na tyle dobrze, aby doradzić bezpośrednio. http://cxf.apache.org/docs/jax-rs-multiparts.html mówi, aby użyć '@ Multipart' _lub podpisu' List '. Jakiej wersji CXF używasz? –

+0

Ponieważ nie mam do czynienia z plikami/załącznikami jako takimi, wypróbowałem '@ Multipart'. Sprawdza, czy 'List ' może być jakiejkolwiek pomocy. Używam wersji 2.5.2. Tam ** są ** przykłady na tej stronie, które wydają się sugerować, że powinno być proste przejście do POST wielu parametrów przy użyciu '@ Multipart'. Chyba czegoś brakuje. – domino

3

Wymyśliłem sposób, aby to zrobić (patrz kod poniżej). Ale jeśli znasz lepszy sposób, który najlepiej nie używa pojęcia "załączników" i używa jaxrs: klient bezpośrednio zamiast WebClient, proszę dać mi znać.

Usługa:

@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 
    ); 

Klient:

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

Czy mogę używać Multipart w config? Z jakiegoś powodu mój interfejs usługi i klasa implementacji nie mogły korzystać z adnotacji Jax-rs/Cxf, więc chcę opublikować usługę w sposób konfiguracyjny. Ale znalazłem plik schematu schematu zasobów usługi jaxrs-common.xsd nie obsługuje Multipart Param i dokument nie wspomniałem, że na tej stronie http://cxf.apache.org/docs/jax-rs-multiparts.html jest jakiś sposób użycia go w config? Wielkie dzięki! – Allen