2012-03-08 6 views
5

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

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

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

Замена @FormParam с @MultipartResource 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, но я думаю, что это не работает в случае передачи нескольких параметров? Должен ли я определять своих собственных читателей тела сообщений & авторов? Любой пример кода был бы полезен.

Благодаря

ответ

1

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

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

+1

Удаление '@ Consumes' помог. Однако я понял, что мне нужно передать параметры '@ Multipart', поскольку мои параметры не просты. Мне нужны POST 2 params этих типов: 1. «Список <Карта >' и 2. 'MyCustomObject'. Передача 1 такого параметра работает отлично (я определил 'XmlJavaTypeAdapter' для' Map 'и аннотировал' MyCustomObject' с '@ XmlRootElement'). Но когда я передаю оба параметра, он бросает 'имеет более одного параметра, представляющего ошибку тела запроса. Я попробовал 'multipart/mixed' и' multipart/related' для '@ Consumes' и отмеченные параметры с помощью' @ Multipart'. Оцените быструю помощь. – domino

+0

@domino Хм, вы выходите за пределы области, которую я знаю достаточно хорошо, чтобы напрямую посоветовать. http://cxf.apache.org/docs/jax-rs-multiparts.html говорит, что используйте '@ Multipart' _or_ подпись' List '. Какую версию CXF вы используете? –

+0

Поскольку я не имею дело с файлами/вложениями как таковыми, я попробовал '@ Multipart'. Будет проверять, может ли 'List ' любая помощь. Я использую 2.5.2. На этой странице ** указаны ** примеры, которые, по-видимому, предполагают, что они должны быть прямолинейными для нескольких параметров POST с помощью '@ Multipart'. Наверное, я что-то упускаю. – domino

3

Я понял способ сделать это (см. Код ниже). Но если вы знаете лучший способ, который предпочтительно не использует концепцию «вложений» и использует jaxrs: клиент напрямую, а не 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()); 
+0

Могу ли я использовать Multipart в config? По какой-то причине мой интерфейс службы и реализация класса не могут использовать аннотации Jax-rs/Cxf, поэтому я хочу публиковать сервис в config.Но я нашел файл схемы ресурсов модели сервиса jaxrs-common.xsd не поддерживает Multipart Param и документ не что на этой странице http://cxf.apache.org/docs/jax-rs-multiparts.html, есть ли способ использовать его в config? Большое спасибо! – Allen

Смежные вопросы