2012-03-08 26 views
5

Làm cách nào để gửi nhiều thông số trong phần yêu cầu trong yêu cầu POST?CXF JAXRS - Cách ĐĂNG NHẬP nhiều thông số

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

Trên mã trả về HTTP 415.

Thay @FormParam với @Multipart kết quả trong Resource method has more than one parameter representing a request body lỗi, như hình dưới đây.

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) 

Ngoài ra, tôi cần phải làm gì để chuyển nhiều loại phức tạp như List<Map<String, String>>' or 'List<MyNestedCustomObject> trong phương thức POST? Tôi có thể chuyển thông số như vậy bằng cách sử dụng JAXB và chú thích nó bằng @XmlJavaTypeAdapter, nhưng tôi đoán điều đó không hoạt động trong trường hợp truyền nhiều thông số? Tôi có phải được yêu cầu xác định độc giả của người đọc tin nhắn của riêng mình & nhà văn không? Bất kỳ mã mẫu nào cũng hữu ích.

Cảm ơn

Trả lời

1

Bạn không sử dụng @FormParam với @Consumes; chỉ sử dụng @FormParam trên các thông số và CXF sẽ tìm ra phần còn lại.

Khi tôi trả về kết quả, tôi trả về một đối tượng được chú thích JAXB có chứa danh sách thứ. CXF sử dụng nội bộ Jettison, sử dụng các chú thích JAXB đó để hướng dẫn chuyển đổi sang JSON. Điều này làm việc khá tốt cho tôi.

+1

Loại bỏ '@ Consumes' giúp. Tuy nhiên, tôi nhận ra rằng tôi cần truyền các tham số '@ Multipart' vì các tham số của tôi không đơn giản. Tôi cần phải POST 2 params của các loại: 1. Danh sách > 'và 2.' MyCustomObject'. Việc truyền 1 tham số như vậy hoạt động tốt (tôi đã định nghĩa 'XmlJavaTypeAdapter' cho' Bản đồ 'và chú giải' MyCustomObject' với '@ XmlRootElement'). Nhưng khi tôi vượt qua cả hai tham số, nó ném 'có nhiều hơn một tham số đại diện cho một lỗi body' yêu cầu. Tôi đã thử 'multipart/mixed' &' multipart/related' cho '@ Consumes' và các tham số được đánh dấu bằng' @ Multipart'. Đánh giá cao sự trợ giúp nhanh chóng. – domino

+0

@domino Hmm, bạn đang ở ngoài khu vực mà tôi biết đủ để tư vấn trực tiếp. http://cxf.apache.org/docs/jax-rs-multiparts.html nói để sử dụng '@ Multipart' _or_ một chữ ký của' Danh sách '. Bạn đang sử dụng phiên bản CXF nào? –

+0

Vì tôi không xử lý bất kỳ tệp/tệp đính kèm nào như vậy, tôi đã thử '@ Multipart'. Sẽ kiểm tra xem 'Danh sách ' có thể giúp được gì không. Tôi đang sử dụng 2.5.2. Có ** là ** ví dụ trên trang đó có vẻ gợi ý rằng nó nên thẳng về phía trước để POST nhiều tham số bằng cách sử dụng '@ Multipart'. Tôi đoán tôi đang thiếu một cái gì đó. – domino

3

Tôi đã tìm ra cách để thực hiện việc này (xem mã bên dưới). Nhưng nếu bạn biết một cách tốt hơn, tốt nhất là không sử dụng khái niệm "phần đính kèm" và sử dụng jaxrs: client trực tiếp thay vì WebClient, vui lòng cho tôi biết.

dịch vụ:

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

Chủ đầu tư:

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

Tôi có thể sử dụng Multipart trong cấu hình không? Trong một số lý do giao diện dịch vụ của tôi và lớp thực hiện không thể sử dụng chú thích Jax-rs/Cxf, vì vậy tôi muốn xuất bản dịch vụ theo cách cấu hình.Nhưng tôi đã tìm thấy tệp lược đồ tài nguyên mô hình dịch vụ jaxrs-common.xsd không hỗ trợ Multipart Param và tài liệu không đề cập rằng, hoặc trên trang này http://cxf.apache.org/docs/jax-rs-multiparts.html, có cách nào để sử dụng nó trong cấu hình? Cảm ơn rất nhiều! – Allen

Các vấn đề liên quan