CXF JAXRS - как разместить более одного параметра - PullRequest
5 голосов
/ 08 марта 2012

Как отправить более одного параметра в теле запроса в запросе POST?

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

Приведенный выше код возвращает HTTP 415.

Замена @FormParam на @Multipart приводит кОшибка Resource method has more than one parameter representing a request body, как показано ниже.

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)

Кроме того, что мне нужно сделать, чтобы передать несколько сложных типов, таких как List<Map<String, String>>' or 'List<MyNestedCustomObject>, в метод POST?Я могу передать такой параметр с помощью JAXB и аннотировать его с помощью @XmlJavaTypeAdapter, но я думаю, что это не работает в случае передачи нескольких параметров?Должен ли я определять своих собственных читателей и авторов тела сообщения?Любой пример кода будет полезен.

Спасибо

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Я нашел способ сделать это (см. Код ниже).Но если вы знаете лучший способ, который предпочтительно не использует понятие «вложения» и использует jaxrs: client напрямую вместо WebClient, пожалуйста, дайте мне знать.

Сервис:

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

Клиент:

    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());
1 голос
/ 09 марта 2012

Вы не используете @FormParam с @Consumes; используйте только @FormParam для параметров, а CXF определит остальное.

Когда я передаю результаты, я возвращаю один JAXB-аннотированный объект, который содержит список вещей. CXF внутренне использует Jettison , который использует эти аннотации JAXB для руководства преобразованием в JSON. Это хорошо работает для меня.

...