2012-03-08 41 views
5

POST isteğinde istek gövdesine birden fazla parametre nasıl gönderirim? aşağıda gösterildiği gibi kod ÜstüCXF JAXRS - Birden çok parametre POST nasıl yapılır

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

, HTTP Resource method has more than one parameter representing a request body hata @Multipart sonuçlarla @FormParam değiştirilmesi 415.

döndürür.

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) 

Ayrıca, böyle bir POST yöntemde List<Map<String, String>>' or 'List<MyNestedCustomObject> gibi birden karmaşık türleri geçmek için yapılması gerekenler gerekiyor? Bu parametreyi JAXB kullanarak ve @XmlJavaTypeAdapter ile ek açıklama ekleyerek geçebiliyorum, ama bu birden çok parametre geçirme durumunda işe yaramaz sanırım? Kendi mesaj vücut okuyucularmı & yazarlarımı tanımlamam gerekir mi? Herhangi bir örnek kod yararlı olacaktır.

Teşekkür

cevap

1

Sen @Consumes ile @FormParam kullanmayın; Parametreler üzerinde sadece @FormParam kullanın ve geri kalanını CXF çözecektir.

Sonuçları geri döndüğümde, şeylerin listesini içeren tek bir JAXB açıklamalı nesne döndürürüm. CXF dahili olarak, JSON'a dönüştürmeyi yönlendirmek için bu JAXB ek açıklamalarını kullanan Jettison kullanır. Bu benim için oldukça iyi çalışıyor.

+1

. Ancak, paramlarım basit olmadığı için 'Multipart' paramlarını geçmem gerektiğini anladım. Bu türden POST 2 parametrelerine ihtiyacım var: 1. List > 've 2.' MyCustomObject'. Böyle bir paramın başarılı geçmesi ('Map 'için' XmlJavaTypeAdapter' tanımladı ve '@ XmlRootElement' ile' MyCustomObject 'ifadesini ekledi. Ama her iki paramiti geçtiğimde, 'bir istek gövdesini temsil eden birden fazla parametre var' hatası veriyor. '@ Consumes' için multipart/mixed' &' multipart/related' denedim ve 'Multipart' ile işaretli paramları denedim. Hızlı yardım için teşekkür ederiz. – domino

+0

@domino Hmm, doğrudan tavsiyede bulunduğum alanın dışına çıkıyorsunuz. http://cxf.apache.org/docs/jax-rs-multiparts.html, '@ Multipart' _or_' List 'imzasını kullanacak. Hangi CXF sürümünü kullanıyorsunuz? –

+0

Bu şekilde herhangi bir dosya/ek ile uğraşmadığımdan, '@ Multipart' denedim. ' 'Listesinin herhangi bir yardımı olup olmadığını kontrol eder. 2.5.2 kullanıyorum. **, bu sayfada, '@ Multipart' kullanarak çoklu parametrelerin POST olması gerektiğini öne süren örneklerdir. Sanırım bir şey özlüyorum. – domino

3

Bunu yapmanın bir yolunu buldum (aşağıdaki kod). Ama daha iyi bir yol biliyorsanız, tercihen "ekleri" kavramını kullanmaz ve jaxrs: client'i doğrudan WebClient yerine kullanırsa, lütfen bana bildirin.

Hizmeti:

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

Müşteri: Consumes` yardımcı @ `Çıkarma

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

Yapılandırmada Multipart kullanabilir miyim? Bazı nedenlerden dolayı hizmet arayüzüm ve uygulama sınıfım Jax-rs/Cxf ek açıklamalarını kullanamadı, bu yüzden hizmeti yapılandırma biçiminde yayınlamak istiyorum. Ancak hizmet modeli kaynak şema dosyasını buldum jaxrs-common.xsd desteklemiyor Multipart Param ve belge Bu sayfada ya http://cxf.apache.org/docs/jax-rs-multiparts.html, yapılandırmada kullanmak için herhangi bir yolu olduğunu belirtti? Çok teşekkürler! – Allen

İlgili konular